Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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 执行顺序和Thread.sleep_Java_Multithreading - Fatal编程技术网

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
的工作精度。

该代码可以输出booth
t1t2
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