2013-11-23 35 views
4

在实用程序库我创建的ExecutorService关闭ExecutorService的优雅当主线程完成

ExecutorService es = Executors.newSingleThreadExecutor(); 

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

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

回答

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); 
     } 
    } 
}); 

在您的工具类的构建/初始化时执行此操作。

+0

几乎工作时,后台程序执行不关机,直到主类的所有主题执行完毕(除非它们也守护进程)

试试这个代码。 :)如果主线程足够好,可以调用System.exit(0);在执行结束时。然而,这个库的用户不能被信任那么做:( –

+0

)如果最终用户不想要优雅地关闭,那么没有任何可以做的事。例如微软知道这个很好。最好你可以做的是保存一些有关[user prefs](http://docs.oracle.com/javase/7/docs/api/java/util/prefs/Preferences.html)中某处进程的信息,然后在程序再次启动时查找它,然后最终通知用户,如“在上次运行期间程序似乎已经意外结束,这里有一些未完成的进程[...]你想重新运行它们吗?”等等。 – BalusC

+0

也许有一些方法可以知道主线程没有什么可执行的了? –

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; 
     } 
    });