我不知道为什么junit有以下行为:
当线程具有睡眠行为(Thread.sleep())时,我将线程提交到执行程序(fixedThreadPool或其他)中,我发现该线程立即结束!没有睡觉,没有中断的事件。
我想知道为什么?
(我知道以下设计并不好,但我只想描述上述问题)
@Test
public void executorPoolTest(){
ExecutorService cachedThreadPool =
Executors.newFixedThreadPool(10);
//Executors.newCachedThreadPool();
for (int i = 0; i < 1000; i++) {
final int index = i;
cachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println(index);
try {
Thread.sleep( 5000);
System.out.println(index+"_");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
//no matter whether you call shutdown, the above program will ends quickly.
cachedThreadPool.shutdown();
}
以上程序不打印任何数字+&#34; _&#34;,非常奇怪。 但是,如果上面的方法在main方法中运行(我的意思是:public static void main(String [] args)),行为是正常的,线程将睡眠并且&#34; _&#34;可以打印。
我想知道为什么?在junit框架中发生了什么?如果是这样,我不能使用junit来测试执行者所涉及的方法吗?
junit版本是4.12。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
答案 0 :(得分:2)
是的,因为您没有等待您计划完成的任务。如果你有其他单元测试,你创建的线程仍将继续在后台执行,但你的测试将完成,因为你没有告诉它做任何其他事情。如果这是你唯一的测试,没有任何东西可以使进程保持活动状态,所以测试套件将完成而没有来自线程的输出。
如果您在关机后调用awaitTermination
,然后它将等待所有线程在测试完成之前完成。