我继承了一些使用 Executors.newFixedThreadPool(4); 的代码。运行完成应用程序所有工作的 4 个长寿命线程。
这是推荐的吗?我已经阅读了Java Concurrency in Practice一书,关于如何管理长期存在的应用程序线程似乎没有太多指导。
在应用程序的整个生命周期中,启动和管理多个线程的推荐方法是什么?
我继承了一些使用 Executors.newFixedThreadPool(4); 的代码。运行完成应用程序所有工作的 4 个长寿命线程。
这是推荐的吗?我已经阅读了Java Concurrency in Practice一书,关于如何管理长期存在的应用程序线程似乎没有太多指导。
在应用程序的整个生命周期中,启动和管理多个线程的推荐方法是什么?
您提到代码正在使用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();
干杯!!
我假设您的长寿线程在循环中执行一些定期工作。您可以执行以下操作:
while( ! pool.isShutdown() ) { ... }
因此,您的 runnable 必须引用其父池。
Runtime.addShutdownHook()
. pool.shutdown()
然后钩子调用pool.awaitTermination()
。池将转换为 SHUTDOWN 状态,最终线程将停止,之后它将转换为 TERMINATED 状态。--
也就是说,我对你的 4 个线程有点怀疑。不应该只有 1 个长寿命线程,它获取任务并将它们提交给执行器服务吗?你真的有 4 个不同的长寿命进程吗?(这个考虑与主要问题是正交的)。