2013-03-21 70 views
0

線程的創建和啓動

class MyThread extends Thread 
{ 
} 

MyThread obj = new MyThread(); 
Thread t = new Thread(obj); 
t.start() 

Vs的

obj.start() 

之間的差異是否有任何優勢,在選擇一個比其他?

+0

線程實現Runnable – NilsH 2013-03-21 12:09:57

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – 2013-03-21 12:21:00

回答

1

您的對象已經擴展了Thread,所以不需要將它包裝在一個新的Thread對象中。如果你正在實現Runnable,第一種方法是正確的。

1

new Thread(obj)代表Thread.runobj。這僅使用obj作爲Runnable而不使用Thread

MyRunnable obj = new MyRunnable(); 
Thread t = new Thread(obj); 
t.start(); 

由於(在你的代碼)你實例化兩個線程(一個是啓動,一個是從來沒有開始,你支付增設一個線程的一些費用)。除此之外,可運行的表單會導致更好的設計,因爲您沒有擴展Thread,因此只能覆蓋run

假如你實現你的邏輯與Runnable,你將能夠使用ThreadFactory,你不會再被捆綁的Thread默認實現(來得心應手在某些情況下)。

5

一般而言,您不應該擴展Thread,而應該改爲Runnable。那麼你的榜樣將成爲:

class MyRunnable implements Runnable { 

    public void run() { 
     // Whatever needs to be done. 
    } 
} 

MyRunnable obj = new MyRunnable(); 
Thread t = new Thread(obj); 
t.start() 
3

是的,是有區別的:你應該延長Thread,但使用new Thread(myRunnable)。這與您的第一種方法類似,只是您的方式在擴展Thread而不是實現Runnable時被誤導。所以這樣做:

class MyRunnable implements Runnable { 
    public void run() { ... } 
} 

Thread t = new MyThread(new MyRunnable()); 
t.start(); 

,或者更方便,

new Thread(new Runnable() { public void run() { 
    ... stuff ... 
}}).start(); 

一定要區分ThreadRunnable的概念:前者是一個重量級的手柄到實際系統資源;後者只是一種方法的持有者。

1

這似乎令人困惑。

我寧願落實Runnable界面,然後可以做出對象不僅可爲Thread構造,還要線程池,這在稍後時間消耗,提交給線程Runnable對象執行人等。