如果只调用一个运行(主)和睡眠(1000)的线程,那么线程是否会睡眠1秒或至少1秒?

时间:2015-05-15 10:48:13

标签: java multithreading thread-sleep

在下面的代码中:

 class Test {
      public static void main(String [] args) {
           printAll(args);
      }
      public static void printAll(String[] lines) {
           for(int i=0;i<lines.length;i++){
                System.out.println(lines[i]);
                Thread.currentThread().sleep(1000);
           }
      }
 }

数组行中的每个String都会输出:

  1. 行之间暂停1秒?
  2. 至少行之间暂停1秒?

6 个答案:

答案 0 :(得分:7)

暂停约1秒钟。线程可以事先被唤醒,你会得到一个InterruptedException,或者线程可以休眠1000毫秒然后不能立即运行,所以它将是1000毫秒+微秒(或更多,如果有更高的优先级占用CPU的线程。)

你也称错了。它是Thread.sleep(1000);,作为一个静态方法,它总是作用于当前线程,你不能让其他线程与它一起睡觉。

答案 1 :(得分:1)

所以它会在1秒内完全睡眠达到最佳知识。 thread.sleep方法并不完美。请参阅此问题和其他相关问题:

https://stackoverflow.com/a/18737109/4615177

答案 2 :(得分:1)

有关Thread.sleep的一些观点 1.总是当前线程进入睡眠状态 2.线程可能无法在所需时间内睡眠(甚至根本不睡觉); 睡眠持续时间将受制于某些系统特定的粒度,通常为1ms;
3.在休眠时,线程仍然拥有它已获得的同步锁;
4.睡眠可以中断(有时用于实现取消功能);
5.使用某些值调用sleep()可能会对OS产生一些微妙的全局影响
所以最后你可以每个String输出在行之间至少有1秒的暂停。
你说错了。这是静态方法.. :))

答案 3 :(得分:1)

调用Thread.sleep(1000)方法,将当前正在执行的线程置于指定时间的等待状态。根据您的程序,它似乎只有一个线程程序,因此,调用线程处于等待状态,没有其他线程处于运行状态,因此在1000毫秒后,您的线程将有机会在1000毫秒后执行,但不确定其他线程没有线程执行的应用程序。

答案 4 :(得分:0)

如果不被其他线程打断,它将至少睡1秒钟。如果某个其他线程中断它,则会抛出InterruptedException

理想情况下,它会睡1秒钟,一旦该时间过去,它将等待它再次进入运行状态。

答案 5 :(得分:0)

阅读文档。 (为什么没有其他人这么说?)Thread.sleep()的javadoc说,

  

使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统定时器和调度程序的精度和准确性。

这很模糊,但这是你得到的所有保证。确切的行为取决于您正在运行的操作系统以及可能正在运行的JVM。

需要精确计时的应用程序称为实时应用程序,并且有一些特殊的实时操作系统(RTOS)会在一定时间内告诉您其预定时间的微秒数实际上会发生。您甚至可以在RTOS上运行Java的实时版本。 http://en.wikipedia.org/wiki/Real_time_Java