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