sleep()是Thread類的靜態方法。從多線程調用時它是如何工作的。以及它如何找出當前的執行線程。 ?Thread.sleep()在多線程調用時如何工作
或可能是一個更一般的問題將是如何從不同的線程調用靜態方法?會不會有任何併發問題?
sleep()是Thread類的靜態方法。從多線程調用時它是如何工作的。以及它如何找出當前的執行線程。 ?Thread.sleep()在多線程調用時如何工作
或可能是一個更一般的問題將是如何從不同的線程調用靜態方法?會不會有任何併發問題?
它是如何計算出當前的 執行線程?
它不是必須的。它只是調用操作系統,它總是睡覺調用它的線程。
sleep
方法睡眠當前線程,所以如果您從多個線程調用它,它將睡眠每個線程。另外還有一個靜態方法currentThread,它可以讓你獲得當前正在執行的線程。
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就不會有任何併發問題。 只有當多個線程正在修改類或實例的內部狀態而未正確同步時,您將遇到問題。
一個更一般的問題將是如何從不同的線程調用靜態方法?會不會有任何併發問題?
如果一個或多個線程在另一個線程使用相同狀態時修改共享狀態,那麼只有潛在的併發問題。 sleep()方法沒有共享狀態。
當虛擬機遇到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
MyRunnable
其run()
方法: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;
沒有'中斷'。 – EJP 2010-08-21 12:21:52
+1:我找不到正確的單詞。 – 2010-08-28 07:16:49