gpt4 book ai didi

java - Thread.sleep 在 ExecutorService 循环中导致意外行为

转载 作者:行者123 更新时间:2023-11-30 07:13:57 25 4
gpt4 key购买 nike

在下面的测试类中,只是输出“before”。

但如果我删除了 Thread.sleep,则会输出以下内容:

before
after
before
after
before
after
before
after
before
after
before
after
before
after
before
after
before
after
before
after

这是我所期望的。

当我使用 Thread.sleep 时,我认为

的每个输出之间应该有 1000 毫秒的延迟
before
after

为什么没有发生这种情况以及如何修改代码,以便无论是否调用 sleep 生成的输出都是相同的?

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import org.junit.Test;

public class RunExecutorTest {

private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

private class RunTest implements Runnable {
public void run() {

System.out.println("before");

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("after");
}
}

@Test
public void testRun() {

Runnable r = new RunTest();

for(int counter = 0; counter < 10; ++counter) {
executor.execute(r);
}
}

}

阅读下面的评论更新“@user470184 它在 junit 测试用例中不起作用,因为主线程完成时 Junit 会杀死所有线程。– Sotirios Delimanolis”如果我添加

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

在测试方法的末尾,它会按预期工作。

最佳答案

When I use Thread.sleep I think that there should be a 1000ms delay between each output of

before after

Why is this not occuring & how can the code be amended so that the generated output is same regardless of calling sleep or not ?

延迟明显在beforeafter之间,而不是在它们的每次迭代之间

System.out.println("before");

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("after");

屈服

before
...1000 millis
after
before
...1000 millis
after

也许我误解了你的问题。

确实有一个包含 1 个线程的线程池。

private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

所有这些都会按顺序输出。


至于为什么 JUnit 会失败,JUnit 会在其主线程完成执行时终止所有线程。你无法真正控制它(除非实现你自己的等待机制)。

关于java - Thread.sleep 在 ExecutorService 循环中导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880359/

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