当执行程序遇到Thread.sleep时,为什么线程在没有睡眠的情况下结束或抛出InterruptedException?

时间:2016-05-29 09:20:41

标签: java multithreading junit executorservice thread-sleep

我不知道为什么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>

1 个答案:

答案 0 :(得分:2)

是的,因为您没有等待您计划完成的任务。如果你有其他单元测试,你创建的线程仍将继续在后台执行,但你的测试将完成,因为你没有告诉它做任何其他事情。如果这是你唯一的测试,没有任何东西可以使进程保持活动状态,所以测试套件将完成而没有来自线程的输出。

如果您在关机后调用awaitTermination然后它将等待所有线程在测试完成之前完成。