我希望几乎每个使用过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();
}
}
答案 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;
}
});