class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
Vs的
obj.start()
之間的差異是否有任何優勢,在選擇一個比其他?
class MyThread extends Thread
{
}
MyThread obj = new MyThread();
Thread t = new Thread(obj);
t.start()
Vs的
obj.start()
之間的差異是否有任何優勢,在選擇一個比其他?
您的對象已經擴展了Thread,所以不需要將它包裝在一個新的Thread對象中。如果你正在實現Runnable,第一種方法是正確的。
new Thread(obj)
代表Thread.run
到obj
。這僅使用obj
作爲Runnable
而不使用Thread
。
MyRunnable obj = new MyRunnable();
Thread t = new Thread(obj);
t.start();
由於(在你的代碼)你實例化兩個線程(一個是啓動,一個是從來沒有開始,你支付增設一個線程的一些費用)。除此之外,可運行的表單會導致更好的設計,因爲您沒有擴展Thread
,因此只能覆蓋run
。
假如你實現你的邏輯與Runnable
,你將能夠使用ThreadFactory
,你不會再被捆綁的Thread
默認實現(來得心應手在某些情況下)。
Thread t = new Thread(obj);
需要Runnable obj
- 推薦的方法。
MyThread obj = new MyThread();
需要你extend
Thread
這是認爲不可取時下。
有關辯論的詳情,請參見"implements Runnable" vs. "extends Thread"。
一般而言,您不應該擴展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()
是的,是有區別的:你應該不延長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();
一定要區分Thread
和Runnable
的概念:前者是一個重量級的手柄到實際系統資源;後者只是一種方法的持有者。
這似乎令人困惑。
我寧願落實Runnable界面,然後可以做出對象不僅可爲Thread
構造,還要線程池,這在稍後時間消耗,提交給線程Runnable
對象執行人等。
線程實現Runnable – NilsH 2013-03-21 12:09:57
http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – 2013-03-21 12:21:00