最近我看到一些代码依赖于不同线程中的执行顺序,这是通过使用某些值调用Thread.sleep
来实现的。它没有任何问题,但我确信在某些罕见的情况下它不会。我写了一些代码,其中输出顺序取决于Thread.sleep
的精确程度。
public class Test {
public static Thread createDelayedPrintThread(final String text,
final long delay) {
return new Thread() {
public void run() {
try {
Thread.sleep(delay);
System.out.print(text);
} catch (InterruptedException e) {
}
}
};
}
public static void main(String[] args) {
Thread t1 = createDelayedPrintThread("t1", 10);
Thread t2 = createDelayedPrintThread("t2", 10);
t1.start();
t2.start();
}
}
此代码不经意地可以输出展位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
?
答案 0 :(得分:3)
Thread.sleep不是保证。 Java教程,关于Thread.sleep():
“然而,这些睡眠时间并不能保证精确,因为它们受到底层操作系统提供的设施的限制。此外,睡眠时间可以通过中断终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用sleep会在指定的时间段内暂停该线程。“
因此,您需要添加其他多线程逻辑以保证执行顺序。
答案 1 :(得分:3)