gpt4 book ai didi

java - 线程在 JUnit 中表现异常

转载 作者:太空狗 更新时间:2023-10-29 23:02:25 25 4
gpt4 key购买 nike

我正在尝试编写需要多线程的单元测试。但是,线程似乎只是在执行过程中停止了一部分。考虑以下代码:

public class Test {
@org.junit.Test
public void TestThreads() {
new Thread(new Runnable() {
public void run() {
for (int i = 1; i < 1000; i++) System.out.println(i);
}
}).start();
}
}

如果我运行这个单元测试,它通常会在 140-180 之间的某个位置停止显示输出。如果我将此代码转换为常规类并运行它,它就可以正常工作。有人知道我在这里缺少什么吗?

谢谢,- 安德鲁。

最佳答案

您可以使用 Thread.join() 来防止测试在新线程完成其任务之前完成:

@org.junit.Test
public void TestThreads() throws InterruptedException {
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 1; i < 1000; i++) System.out.println(i);
}
});
t.start();
t.join();
}

通常,JVM 会在最后一个非守护线程终止时终止。您可能希望在线程上简单地调用 t.setDaemon(false) 会阻止 JVM 在任务完成之前退出。 然而,junit 会call System.exit() 当主线程完成时。

正如 Gus 在评论中指出的那样:“您需要 join(),因为 start() 不会阻塞”。

他是对的,您也可以在这个最小示例中调用 run()。但是,我假设您正在启动一个线程,因为您希望它与另一个线程同时运行。在 Thread 上调用 run() 被 FindBugs 标记为可能的错误 - 如果您只是要调用 run(),您可能只想实现 Runnable 而不是使用 Thread。

关于java - 线程在 JUnit 中表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16616590/

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