我已经继承了一些使用Executors.newFixedThreadPool(4)的代码;运行4个长期线程来完成应用程序的所有工作。Java执行器和长命线程
这是推荐吗?我读过Java Concurrency in Practice这本书,似乎没有太多关于如何管理长期应用程序线程的指导。
什么是建议的方式来启动和管理多个线程,每个线程生活的应用程序的整个生活?
我已经继承了一些使用Executors.newFixedThreadPool(4)的代码;运行4个长期线程来完成应用程序的所有工作。Java执行器和长命线程
这是推荐吗?我读过Java Concurrency in Practice这本书,似乎没有太多关于如何管理长期应用程序线程的指导。
什么是建议的方式来启动和管理多个线程,每个线程生活的应用程序的整个生活?
你提到的代码使用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();
干杯!
我假设你的长寿命线程在循环中做一些周期性的工作。你可以做的是以下几点:
让sur可以在循环之前检查池中的每个可运行状态。因此
while(! pool.isShutdown()) { ... }
您可运行必须有自己的父池的参考。
用Runtime.addShutdownHook()
安装JVM关闭钩子。该钩子呼叫pool.shutdown()
,然后pool.awaitTermination()
。池将转换到SHUTDOWN状态,最终线程将停止,之后将转换到TERMINATED状态。
-
这就是说,我有点怀疑你的四个线程。不应该只有1个长生命线程,它提取任务并将它们提交给执行器服务?你真的有4个不同的长寿过程吗? (这个考虑与主要问题是正交的)。
我只是最近继承了这个代码,并没有写出来。但我认为你的最后一点很好地表达了我的关注。我想知道整个设计是否不正确。 – mattx
我的问题不在于用这种方式来管理长寿命的应用程序线程是否安全,而在于它是否是最佳实践。 – mattx
是的,只要你照顾正常关闭并关闭这些线程使用的所有资源。 –