主线程完成时正常关闭ExecutorService

时间:2013-11-23 13:55:51

标签: java threadpool executorservice

在实用程序库中,我正在创建ExecutorService

ExecutorService es = Executors.newSingleThreadExecutor();

主线程然后会将一些任务发布到此ExecutorService。当主线程完成时,我想关闭ExecutorService以允许应用程序退出。

问题是我只能更改实用程序库中的代码。我考虑过的一个选择是使用守护进程线程。但是,在发布到服务的任务完成之前,它会突然关闭。

2 个答案:

答案 0 :(得分:5)

使用Runtime#addShutdownHook()向当前运行时添加关闭挂钩。

E.g。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        es.shutdown();
        try {
            es.awaitTermination(5, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            logger.info("during await",e);
        }
    }
});

在构建/初始化实用程序类时执行此操作。

答案 1 :(得分:3)

除非您使执行程序成为守护程序线程,否则

shutdownHook将无效。这就是原因

shutdownhook在JVM开始退出时启动,JVM将不会退出,除非您调用es.shutDown()使其陷入僵局。

我不知道为什么让守护进程执行器不起作用。这应该。在主类启动的所有线程完成执行之前,守护程序执行程序不会关闭(除非它们也是守护程序)

在创建执行程序时尝试此代码

   ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t;
        }
    });