繁体   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