[英]Thread.join(millisecond) is not accuracy in java?
眾所周知,在java中,Thread.join(long millis)的意思是“等待最多毫秒數才能使該線程死亡”,但是我發現毫秒數不是很准確,請參見以下代碼:
public class MyThreadTest {
public void invokeTest() {
long executionTimeLimit = 10;
Runner rn = new Runner();
rn.start();
try {
long time = System.currentTimeMillis();
rn.join(executionTimeLimit);
long l1 = (System.currentTimeMillis() - time);
System.out.println("execution_time_limit="+executionTimeLimit+" the invoke method time is "+l1+" millisecond");
} catch (Exception e) {
//e.printStackTrace();
}
}
public static void main(String args[]) {
MyThreadTest mtt = new MyThreadTest();
mtt.invokeTest();
}
private final class Runner extends Thread {
public void run()
{
//to make the program a bit longer
int size = 3000;
String[][] bb = new String[size][size];
for(int i=0;i<size;i++)
for(int j=0;j<size;j++) {
bb[i][j] = "bbbbbbbbbbb";
}
}
}
}
運行多次以上時,輸出日志不相同:
“” execution_time_limit = 10調用方法時間為11毫秒“” execution_time_limit = 10調用方法時間為32毫秒“” execution_time_limit = 10調用方法時間為34毫秒“
為什么會這樣?
當您等待(n)或睡眠(n)且未中斷或未通知()時,它將至少等待給定的時間。 在join(n)中都可能。 它早就線程的通知/結束喚醒,但是可以在以后任何時候醒來。
線程何時可以喚醒與何時喚醒之間的差異如此之大,因此存在監視此類情況的工具。 jHiccup是最好的之一。
線程喚醒的時間取決於加載,也取決於操作系統。 這可能導致線程在應有的時間后醒來。 MacOS最近的一個問題是,閑置系統最多延遲10秒。
這是Java無法控制的,它取決於您的OS。
順便說一句,如果您以微秒為單位查看抖動,您會看到更加豐富多彩的變化/抖動/過程中斷。
當我們處理線程時,我們永遠無法確保時間准確性,因為這些操作(如等待,連接,睡眠)也取決於系統資源的可用性。
查看Oracle教程http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
doxygen只是讓您感到困惑,因為它說:“等待最多毫秒,該線程死亡。”
join()函數僅允許調用線程“等待一段時間”,而不是永遠卡住。 當join()函數返回時,您在其上調用的線程可能仍在運行(即未“加入”)。 在這種情況下,join() 至少要等待幾毫秒,然后該線程才結束,join()放棄了。 另一方面,如果調用了線程join()實際上完成了,則join()等待的時間少於毫秒。
還請記住,除非您的JVM在實時操作系統上運行(並且那些線程具有一定的優先級),否則可以安排其他進程/線程,從而導致join()返回被延遲更長的時間(在您執行我得到了34毫秒而不是11毫秒)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.