2010-08-21 46 views
7

sleep()是Thread類的靜態方法。從多線程調用時它是如何工作的。以及它如何找出當前的執行線程。 ?Thread.sleep()在多線程調用時如何工作

或可能是一個更一般的問題將是如何從不同的線程調用靜態方法?會不會有任何併發​​問題?

回答

6

它是如何計算出當前的 執行線程?

它不是必須的。它只是調用操作系統,它總是睡覺調用它的線程。

+1

+1:我找不到正確的單詞。 – 2010-08-28 07:16:49

5

sleep方法睡眠當前線程,所以如果您從多個線程調用它,它將睡眠每個線程。另外還有一個靜態方法currentThread,它可以讓你獲得當前正在執行的線程。

-1

Thread.sleep(long)本身在java.lang.Thread類中實現。下面是它的API文檔的一部分:

Causes the currently executing thread to sleep (temporarily cease 
execution) for the specified number of milliseconds, subject to 
the precision and accuracy of system timers and schedulers. The thread 
does not lose ownership of any monitors. 

睡眠方法休眠調用它的線程(基於EJP的評論) 確定當前執行的線程(調用它,並導致它睡覺)。 Java方法可以通過調用Thread.currentThread()

來確定哪個線程正在執行它。可以同時從任意數量的線程調用方法(靜態或非靜態)。只要您的方法是thread safe,Threre就不會有任何併發​​問題。 只有當多個線程正在修改類或實例的內部狀態而未正確同步時,您將遇到問題。

+0

@naikus Implentation說,睡眠是天然的方法。任何想法本機代碼如何確定什麼線程睡覺? – YoK 2010-08-21 06:48:50

+0

@Naikus。我想知道的是,靜態方法中的代碼如何在線程範圍內運行。會有每個方法的副本加載到線程的堆棧嗎? – JWhiz 2010-08-21 06:56:19

+0

@YoK,我不確定,但也許它調用另一個本地方法Thread.currentThread();)。我確定你知道這件事。 – naikus 2010-08-21 07:04:46

0

一個更一般的問題將是如何從不同的線程調用靜態方法?會不會有任何併發​​問題?

如果一個或多個線程在另一個線程使用相同狀態時修改共享狀態,那麼只有潛在的併發問題。 sleep()方法沒有共享狀態。

-1

當虛擬機遇到sleep(long) -statement時,它將中斷正在運行的線程。 「當前線程」在那一刻始終是調用Thread.sleep()的線程。然後它說:

嘿!在這個線程中沒有任何事情要做(因爲我必須等待)。我將繼續其他主題。

更改線程被稱爲「收益」。 (注意:你可以通過自己致電Thread.yield();

所以,它不需要知道當前的線程是什麼。它始終是調用sleep()的線程。 注意:您可以通過調用Thread.currentThread();

簡單例子得到當前線程:

// here it is 0 millis 
blahblah(); // do some stuff 
// here it is 2 millis 
new Thread(new MyRunnable()).start(); // We start an other thread 
// here it is 2 millis 
Thread.sleep(1000); 
// here it is 1002 millis 

MyRunnablerun()方法:Thread類的

// here it is 2 millis; because we got started at 2 millis 
blahblah2(); // Do some other stuff 
// here it is 25 millis; 
Thread.sleep(300); // after calling this line the two threads are sleeping... 
// here it is 325 millis; 
... // some stuff 
// here it is 328 millis; 
return; // we are done; 
+0

沒有'中斷'。 – EJP 2010-08-21 12:21:52