2011-04-30 47 views
3

之間有什麼區別 -睡一個線程靜態與使用它的實例

Thread workerThread = new Thread(runnable); 
workerThread.start(); 
workerThread.sleep(5000); 
..... 

而且

Thread workerThread = new Thread(runnable); 
workerThread.start(); 
Thread.sleep(5000); 

難道他們都可能會導致工人線程暫停睡眠?

感謝

+0

[可以使用對象實例訪問Java中的靜態方法](http://stackoverflow.com/questions/4978000/static-method-in-java-can-be-accessed-using-object-instance ) – nawfal 2013-12-16 10:32:54

回答

8

沒有睡眠是影響當前線程的靜態方法:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep(long)

所以沒有什麼區別,你想要什麼他們都不會做。在實例中使用的靜態方法是 棄用 氣餒,因爲它讓你覺得你可以做一些事情,你卻不能(像在這種情況下)

小加成 - 看約翰的回答why calling static methods from class instances is allowed in Java:-)

+0

+1:我不確定它是否被棄用,因爲某些方法是「@棄用」。但是,如你所說,它非常不鼓勵,因爲它不會做它應該如此。 – 2011-04-30 16:44:09

+0

@彼得 - 謝謝。英語不是我的母語,所以這些評論非常受歡迎:) – MByD 2011-04-30 16:47:04

+0

@MByD,英語是我的母語,但更正,澄清和狡辯總是受歡迎的。我總是可以改進。;) – 2011-04-30 16:57:04

3

唯一的實際調用是

Thread.sleep(5000); 

另一個是你可以通過實例變量調用靜態方法的java怪異。

你應該總是使用

Thread.sleep(5000); 

因爲它是更好的自我證明它是當前線程總是「正在被睡。如果你這樣做

myThread.sleep(5000); 

你沒有睡眠myThread線程,你正在睡眠當前線程。

0

第二個應該是首選的,因爲Thread.sleep是一個靜態方法,因此應該像定義它的類一樣在所有靜態方法上調用,而不是在此類的實例上調用。

4

sleep在這兩個實例中都是相同的靜態方法,它會導致當前正在執行的線程進入睡眠狀態,而不是workerThread。

0

這是另一種可能性。使用揮發性標誌的信息傳遞給C.

volatile boolean startC = false; 

void B() { 
    // Do initial B work. 
    startC = true; // Set the volatile flag. 
    // Finish B processing not relevant to C. 
} 

void C() { 
    // Wait for B to progress far enough. 
    while (!startC) { 
    Thread.sleep(100); 
    } 
    // B has done enough work so we can begin. 
} 

這不是真正的代碼,剛好夠給你什麼,我在得到的想法。例如,您需要注意startC標誌的可見性,或者爲它寫一個公共的getter和setter,使B()和C()都有權訪問。

相關問題