Junit 会关闭所有线程吗?

Posted

技术标签:

【中文标题】Junit 会关闭所有线程吗?【英文标题】:Does Junit shut down all the threads? 【发布时间】:2013-08-09 13:24:34 【问题描述】:

我有一个包含 6 个测试的 Junit 类。当第一个测试运行时,它会调用我的另一个类中的一个方法,该方法会启动一个新的 Thread()。我们就叫它MyThread吧。

这个想法是让MyThread 在 JUnit 测试完成后继续运行一段时间。

例如,要完成所有 JUnit 测试,需要 1 秒,因此我将设置 MyThread 运行 3 秒:

new Thread(new Runable()
    public void run()
        System.out.println("start");
        Thread.sleep(3000);
        System.out.println("end");
    
).start();

start 将显示在标准输出上,但 end 永远不会显示。

在我看来,每当 JUnit 测试完成时,MyThread 也会关闭。

所以我想知道,JUnit 是否关闭了它启动的所有线程?非常感谢。

【问题讨论】:

好的,上下文:我所有的 6 个测试都连接到 HSQLDB 进程内数据库以完成某些工作。由于我不想在每次运行测试时都关闭连接,所以我让它们共享一个连接。我启动了一个线程来监视测试,当所有测试完成后,它将关闭连接和所有。但是每次我的 JUnit 测试结束时,该线程都会终止 【参考方案1】:

这实际上不是 JUnit,而是运行 JUnit 测试的外部系统(如 Eclipse 或 Maven)负责终止 JVM。那些调用 System.exit 停止所有线程。如果 JUnit 这样做了,那么外部系统将没有机会处理结果。

【讨论】:

【参考方案2】:

为了解决your comment 中给出的额外上下文,我建议这正是@BeforeClass@AfterClass 方法的用途。

@BeforeClass 中创建(静态)数据库连接并在@AfterClass 方法中关闭它。无需等待其他测试完成的后台方法。

【讨论】:

以上是关于Junit 会关闭所有线程吗?的主要内容,如果未能解决你的问题,请参考以下文章

java httpclient httpget不关闭,会占用线程吗

使用内核参数会导致银行冲突吗? [关闭]

VC++中通过CreateThread创建的线程,当线程入口函数执行完后,线程自己会关闭吗?

正确关闭线程池:shutdown 和 shutdownNow 的区别

浏览器页面关闭后台线程会中断吗

如果多个线程使用同一个对象,性能会受到影响吗? [关闭]