执行官服务:为什么程序永远不会停止?

时间:2014-03-30 00:47:41

标签: java executorservice

我希望几乎每个使用过ExecutorService运行Threads的人都必须注意到这一点。但我找不到任何解决这个问题的方法。因此我在问。

我的下面的程序永远不会停止。我现在等了5分钟,但程序仍在运行。

当我添加executor.shutdown()时,程序停止。 虽然我知道shutdown()方法的作用,但我不确定的是,我们是否需要在使用EXECUTORS服务的情况下调用此方法?

public class Latch implements Runnable{

    /**
     * @param args
     */
    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(3);
        ExecutorService executor = Executors.newFixedThreadPool(10); 
        for(int i = 0; i < 3; i ++){
        executor.execute(new Latch(latch)); 
        }
        try {
            latch.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("STOPPED");
        executor.shutdown();
    }

    CountDownLatch latch;

    Latch(CountDownLatch latch){
        this.latch = latch;
    }

    @Override
    public void run(){
        System.out.println("Thread Started");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        latch.countDown();

    }

}

1 个答案:

答案 0 :(得分:2)

Executors.newFixedThreadPool()州的javadoc

  

池中的线程将一直存在,直到明确shutdown

基本上ExecutorService会产生一些非守护程序线程,在你调用shutdown()之前它不会停止。在所有非守护程序线程都死亡之前,您的进程不会结束。

如果您需要应用程序结束或使用自己的ThreadFactory,请调用它。这是一个使用守护程序线程和线程池的改进版本,其线程数与计算机具有CPU核心数一样多:

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory()
{
    @Override
    public Thread newThread(final Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
});