首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行者服务:为什么程序永不停止?

执行者服务:为什么程序永不停止?
EN

Stack Overflow用户
提问于 2014-03-30 00:47:41
回答 1查看 1.6K关注 0票数 2

我希望几乎所有使用ExecutorService运行线程的人都一定注意到了这一点。但我找不到解决这个问题的办法。因此我要求。

我下面的程序从未停止过。我已经等了5分钟了,但是程序还在运行。

当我添加executor.shutdown()时,程序将停止。虽然我知道关闭()方法的作用,但我不确定的是,每次使用EXECUTORSERVICE时,我们是否都要调用这个方法呢?

代码语言:javascript
复制
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();

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-30 00:50:19

Executors.newFixedThreadPool()状态的javadoc

池中的线程将存在,直到它显式为shutdown为止。

基本上,ExecutorService生成了一些非守护进程线程,直到调用shutdown()之后才会停止。直到所有非守护进程线程都死掉,您的进程才会结束。

因此,如果您需要您的应用程序结束或使用您自己的ThreadFactory,请调用它。下面是使用守护进程线程和线程池的改进版本,该线程池的线程数量与您的计算机具有CPU内核的线程相同:

代码语言:javascript
复制
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory()
{
    @Override
    public Thread newThread(final Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22738912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档