2013-10-14 25 views
2

我已经继承了一些使用Executors.newFixedThreadPool(4)的代码;运行4个长期线程来完成应用程序的所有工作。Java执行器和长命线程

这是推荐吗?我读过Java Concurrency in Practice这本书,似乎没有太多关于如何管理长期应用程序线程的指导。

什么是建议的方式来启动和管理多个线程,每个线程生活的应用程序的整个生活?

回答

2

你提到的代码使用Executors,应该返回一个ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); 

ExecutorService是一个Executor提供方法来管理终端和方法,可以产生未来跟踪一个或多个异步进度任务。

只要返回ExecutorService正在执行正常关机,应该不会有问题。

你可以检查你的代码做什么shutodwn通过寻找在你的代码如下:

// This will make the executor accept no new threads 
// and finish all existing threads in the queue 
executor.shutdown(); 

// Wait until all threads are finish 
executor.awaitTermination(); 

干杯!

+0

我的问题不在于用这种方式来管理长寿命的应用程序线程是否安全,而在于它是否是最佳实践。 – mattx

+1

是的,只要你照顾正常关闭并关闭这些线程使用的所有资源。 –

1

我假设你的长寿命线程在循环中做一些周期性的工作。你可以做的是以下几点:

  1. 让sur可以在循环之前检查池中的每个可运行状态。因此

    while(! pool.isShutdown()) { ... }

    您可运行必须有自己的父池的参考。

  2. Runtime.addShutdownHook()安装JVM关闭钩子。该钩子呼叫pool.shutdown(),然后pool.awaitTermination()。池将转换到SHUTDOWN状态,最终线程将停止,之后将转换到TERMINATED状态。

-

这就是说,我有点怀疑你的四个线程。不应该只有1个长生命线程,它提取任务并将它们提交给执行器服务?你真的有4个不同的长寿过程吗? (这个考虑与主要问题是正交的)。

+0

我只是最近继承了这个代码,并没有写出来。但我认为你的最后一点很好地表达了我的关注。我想知道整个设计是否不正确。 – mattx