gpt4 book ai didi

java - 执行顺序和Thread.sleep

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:58 32 4
gpt4 key购买 nike

最近我看到一些代码依赖于不同线程中的执行顺序,这些代码是通过使用一些值调用 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();
}
}

这段代码显然可以输出 booth t1t2t2t1 所以我做了不同的延迟:

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

最佳答案

首先,你的理解是正确的;没有多少 Thread.sleep()(顺便说一句,从 Java 5 开始,您实际上应该使用 TimeUnit 代替,如 TimeUnit.SECONDS.sleep(2L)) 将保证按顺序执行;您无法保证操作系统何时安排这个或那个线程。

would be there any guarantees that the application will output t1t2?

是的。

例如,由这两个线程共享的 volatile boolean 变量就可以了(尽管您需要忙等待,所以这并不理想)。另一个例子是 Semaphore .

解决方案有很多,您最终会得到什么完全取决于您的要求。

关于java - 执行顺序和Thread.sleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207262/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com