我继承了一些使用Executors.newFixedThreadPool(4)的代码;运行完成应用程序所有工作的4个长期存在的线程。
这是推荐的吗?我已经阅读了Java Concurrency in Practice一书,并且似乎没有太多关于如何管理长期应用程序线程的指导。
启动和管理多个线程的推荐方法是什么?每个线程都适用于整个应用程序的生命周期?
答案 0 :(得分:2)
您提到代码正在使用Executors
,它应该返回ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
ExecutorService
是一个Executor
,提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法。
只要返回ExecutorService
正在执行正常关闭,就不会出现问题。
您可以通过在代码中查找以下内容来检查您的代码是否正在进行关闭:
// 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();
干杯!!
答案 1 :(得分:1)
我假设您的长期线程在循环中执行某些定期作业。你能做的是以下几点:
创建池中的每个runnable在循环之前检查池的状态。
while( ! pool.isShutdown() ) { ... }
因此,您的runnable必须具有对其父池的引用。
使用Runtime.addShutdownHook()
安装JVM关闭挂钩。钩子调用pool.shutdown()
然后调用pool.awaitTermination()
。池将转换到SHUTDOWN状态,最终线程将停止,之后它将转换为TERMINATED状态。
-
那就是说,我对你的4个线程有点怀疑。是不是只有1个长生命线程,它们获取任务,并将它们提交给执行程序服务?你真的有4种不同的长寿程吗? (这个考虑与主要问题正交)。