Java 主线程完成时正常关闭ExecutorService

Java 主线程完成时正常关闭ExecutorService,java,threadpool,executorservice,Java,Threadpool,Executorservice,在实用程序库中,我正在创建一个ExecutorService ExecutorService es = Executors.newSingleThreadExecutor(); 然后,主线程将向该服务发布一些任务。当主线程完成时,我想关闭ExecutorService以允许应用程序退出 问题是我只能更改实用程序库中的代码。我考虑的一个选项是使用守护进程线程。但是,在发布到服务的任务完成之前,它将突然关闭。用于将关闭挂钩添加到当前运行时 例如 在构造/初始化实用程序类时执行此操作。shutdow

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

ExecutorService es = Executors.newSingleThreadExecutor();
然后,主线程将向该服务发布一些任务。当主线程完成时,我想关闭ExecutorService以允许应用程序退出

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

用于将关闭挂钩添加到当前运行时

例如


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

shutdownHook
将不起作用,除非将执行器设置为守护线程。原因如下

shutdownhook
在JVM开始退出时启动,除非调用
es.shutDown()
,否则JVM不会退出,因此这是一个死锁

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

创建executor时请尝试此代码

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

几乎成功了。:)如果主线程足够好,可以调用System.exit(0);在执行结束时。但是,无法信任此库的用户执行以下操作:(如果最终用户不想优雅地关机,那么没有什么可以反对的。例如,Microsoft非常清楚这一点。您所能做的最好的事情是将有关进程的一些信息保存在中的某个位置,并在程序再次启动时查找它,然后最终通知用户,如中所示“在上次运行期间,程序似乎意外结束,以下是一些未完成的进程[…]是否要重新运行它们?”等等。也许有某种方法可以知道主线程已没有任何可执行的内容了?
   ExecutorService es = Executors.newSingleThreadExecutor( new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t;
        }
    });