Java 执行顺序和Thread.sleep
最近我看到了一些代码,它们取决于不同线程中的执行顺序,这是通过使用一些值调用Java 执行顺序和Thread.sleep,java,multithreading,Java,Multithreading,最近我看到了一些代码,它们取决于不同线程中的执行顺序,这是通过使用一些值调用Thread.sleep实现的。它工作没有任何问题,但我相信在一些罕见的情况下,它不会。我编写了一些代码,其中输出顺序取决于线程.sleep的工作精度。 该代码可以输出bootht1t2和t2t1,因此我将延迟设置为不同的: Thread t1 = createDelayedPrintThread("t1", 10); Thread t2 = createDelayedPrintThread("t2", 20); 现
Thread.sleep
实现的。它工作没有任何问题,但我相信在一些罕见的情况下,它不会。我编写了一些代码,其中输出顺序取决于线程.sleep
的工作精度。
该代码可以输出bootht1t2
和t2t1
,因此我将延迟设置为不同的:
Thread t1 = createDelayedPrintThread("t1", 10);
Thread t2 = createDelayedPrintThread("t2", 20);
现在它输出t1t2
,但我有时仍然得到t2t1
。这通常发生在我执行一些CPU/IO密集型操作时。如果我将延迟更改为非常大的值
Thread t1 = createDelayedPrintThread("t1", 1_000); // one second
Thread t2 = createDelayedPrintThread("t2", 60_000); // one minute
是否可以保证应用程序将输出
t1t2
?线程。睡眠不保证。
Java教程,关于Thread.sleep():
“但是,这些睡眠时间不能保证精确,因为它们受到底层操作系统提供的功能的限制。此外,睡眠时间可以通过中断来终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用睡眠会在指定的时间段内暂停线程。”
因此,您需要为保证执行顺序添加其他多线程逻辑。首先,您的理解是正确的;再多的
Thread.sleep()
(顺便说一句,既然您真的应该使用Java5,比如TimeUnit.SECONDS.sleep(2L)
)都不能保证顺序执行;您无法保证操作系统何时安排此线程或该线程
是否可以保证应用程序将输出t1t2
对
例如,这两个线程共享一个易失性布尔变量就可以了(尽管您需要忙着等待,所以这并不理想)。另一个例子是
解决方案很多,最终的结果完全取决于您的需求。不要忘记,由于安装开销,线程启动不是一个连续的过程。@xTrollxDudex当然可以,但在现代操作系统/硬件组合上,它的速度非常快
Thread t1 = createDelayedPrintThread("t1", 1_000); // one second
Thread t2 = createDelayedPrintThread("t2", 60_000); // one minute