題目 闡述創建線程最常用的兩種方法及其對比。 解答 方法一:繼承Thread類實現 步驟: 方法二:實現Runnable介面 步驟: 繼承Thread類創建線程與實現Runnable介面創建線程的不同之處在於,當用同一個類創建多個線程的時候,前者實際上是創建了多個不同的Thread對象,它內部的ru ...
題目
闡述創建線程最常用的兩種方法及其對比。
解答
方法一:繼承Thread類實現
步驟:
- 創建Thread類的子類,如MyThread。
- 重寫Thread類的run()方法。
- 實例化MyThread類,對象名如myThread。
- 運用Thread類的start()方法啟動線程,如myThread.start()。
方法二:實現Runnable介面
步驟:
- 創建一個類,如MyRunnableThread,實現Runnable介面。
- 創建MyRunnableThread類的對象。
- 實例化Thread類,對象名如thread,並向其構造函數傳入MyRunnableThread類和線程名兩個參數。
- 運用Thread類的start()方法啟動線程,如thread.start()。
繼承Thread類創建線程與實現Runnable介面創建線程的不同之處在於,當用同一個類創建多個線程的時候,前者實際上是創建了多個不同的Thread對象,它內部的run()方法執行的時候是在各自對象中執行,互不幹擾,如同多個線程執行多個任務;而後者實際上是使用同一個對象來創建多個線程,所以對象內的屬性會公用,那就相當於多個線程在執行同一個任務一樣。
另外,在使用上,繼承了Thread類的類就不能繼承其它類了,而實現了Runnable介面的類,還可以繼承其他類,前者相對局限。
這樣子說法可能有點抽象,下麵那用代碼講解一下。
參考代碼
MyThread類
package me.huangzijian; public class MyThread extends Thread { private int num = 10; private String name; public MyThread(String name) { this.name = name; } @Override public void run() { int count = num; for (int i = 0; i < count; i++) { System.out.println(this.name + ":" + num); num--; } } }
MyRunnable類
package me.huangzijian; public class MyRunnableThread implements Runnable { private int num = 10; @Override public void run() { int count = num; for (int i = 0; i < count; i++) { System.out.println(Thread.currentThread().getName() + ":" + num); num--; } } }
TheadCreation類
package me.huangzijian; public class ThreadCreation { public static void main(String[] args) { // 繼承Thread類實現 MyThread myThread1 = new MyThread("MyThread1"); MyThread myThread2 = new MyThread("MyThread2"); MyThread myThread3 = new MyThread("MyThread3"); myThread1.start(); myThread2.start(); myThread3.start(); // 實現Runnable介面 MyRunnableThread myRunnableThread = new MyRunnableThread(); Thread t1 = new Thread(myRunnableThread, "MyRunnableThread1"); Thread t2 = new Thread(myRunnableThread, "MyRunnableThread2"); Thread t3 = new Thread(myRunnableThread, "MyRunnableThread3"); t1.start(); t2.start(); t3.start(); } }
運行結果:
運行ThreadCreation後,我們會看到,繼承Thread類實現的結果如下:
可以看到,三個線程對於欄位num的操作是各操作各的,都將num從10減到1。
而實現Runnable介面的就誒過如下:
可以看到,三個線程對同一個myRunnableThread對象的num進行共同的操作。根據程式,每個線程迴圈10次,所以num從10一直減到負數。有朋友可能會問,為什麼一開始三個線程都會獲取到10,這就是線程同步的問題了,需要用到synchronized等關鍵字進行修飾。