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创建的线程,当线程入口函数执行完后,线程自己会关闭吗?