Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程睡眠时间太长_Java_Multithreading - Fatal编程技术网

Java 线程睡眠时间太长

Java 线程睡眠时间太长,java,multithreading,Java,Multithreading,我写了一个简单的程序,注意到我的线程太快,无法运行JVisualVM,标记我要监视、插入和查看线程的应用程序。然后我让他们睡觉。注意到工具现在报告他们只是在睡觉(或者几乎只是在睡觉)。即使他们工作。这就引出了一个问题:为什么 new Thread(() -> { while(true) { System.out.println("not sleeping"); try { Thread.

我写了一个简单的程序,注意到我的线程太快,无法运行JVisualVM,标记我要监视、插入和查看线程的应用程序。然后我让他们睡觉。注意到工具现在报告他们只是在睡觉(或者几乎只是在睡觉)。即使他们工作。这就引出了一个问题:为什么

    new Thread(() -> {
        while(true) {
            System.out.println("not sleeping");
            try {
                Thread.sleep(0,1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }, "not sleeping!").start();
这个线程应该休眠1纳秒,但看看JVisualVM是如何报告的:

$ while true; do jstack 8277 | grep -A 2 not; done              [% 20:34:27]
"not sleeping!" #10 prio=5 os_prio=0 tid=0x00007f5ea82d1000 nid=0x2078 waiting on condition [0x00007f5e917c6000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)

在跑了57秒后,它报告5秒的跑步时间和休息时间是睡眠-一个错误还是我的理解是错误的

不仅仅是JVisualVM:

$ while true; do jstack 8277 | grep -A 2 not; done              [% 20:34:27]
"not sleeping!" #10 prio=5 os_prio=0 tid=0x00007f5ea82d1000 nid=0x2078 waiting on condition [0x00007f5e917c6000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)

jstack
也只是偶尔报告此线程正在运行。我期望不同的比例,所以请帮助我理解。

你不能期望睡眠时间短到1纳秒。当您请求睡眠时,您将执行一个任务切换,这会使它需要一段时间才能重新安排,特别是当您有其他进程/线程时。因此,如果线程的工作负载非常低,那么它可能会花费大部分时间睡眠


您的睡眠时间也可能在某个层次上被舍入到系统时间粒度的倍数。至少在某些Java实现中,nanos参数是有效的。

您不能依赖线程在指定的确切时间内睡眠。57s是。。。“不过,这太过分了。”我同意安德特特纳的说法。纳米技术更是如此。但我没想到比例会是。。。嗯,倒过来。大部分时间都在睡觉。我要求1纳秒,以使其尽可能少。我从来没有想过1ns,因为在nanos依赖于系统的文档中,几乎所有具有nanos状态的Java方法都依赖于系统。然而,对于其他希望检查是否是这样的人,请查找上下文开关的数量(pidstat或cat thread status from/proc)。谢谢你的源链接和答案!增加工作负载(Fibonacci表示random n)使线程基本上可以运行。