我希望几乎所有使用ExecutorService运行线程的人都一定注意到了这一点。但我找不到解决这个问题的办法。因此我要求。
我下面的程序从未停止过。我已经等了5分钟了,但是程序还在运行。
当我添加executor.shutdown()时,程序将停止。虽然我知道关闭()方法的作用,但我不确定的是,每次使用EXECUTORSERVICE时,我们是否都要调用这个方法呢?
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();
}
}发布于 2014-03-30 00:50:19
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;
}
});https://stackoverflow.com/questions/22738912
复制相似问题