簡體   English   中英

Thread.join(毫秒)在java中不准確嗎?

[英]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。

順便說一句,如果您以微秒為單位查看抖動,您會看到更加豐富多彩的變化/抖動/過程中斷。

微抖動,繁忙的等待和綁定CPU

當我們處理線程時,我們永遠無法確保時間准確性,因為這些操作(如等待,連接,睡眠)也取決於系統資源的可用性。

查看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM