java - 线程在 JUnit 中表现异常

标签 java multithreading junit

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

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/

相关文章:

java - 如何将 WebElement 存储在 json 或属性中以便我可以轻松更改它

java - Spring Boot 的外部库文件夹

c# - 并行化/多线程单例对象方法调用

java - 运行 JUnit 测试有效,但 Gradle 测试无效。怎么修?

Java 集合过滤

java - 如何使用 Selenium 点击特定链接?

java - 同步块(synchronized block)不锁定对象

c - 从多个socket读取 : single thread with select vs. 多线程读取

java - 小型 java 项目成长(maven 和 junit)

java - 在 Netbeans 中运行给定包中的所有 junit 测试?