2

我继承了一些使用 Executors.newFixedThreadPool(4); 的代码。运行完成应用程序所有工作的 4 个长寿命线程。

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

在应用程序的整个生命周期中,启动和管理多个线程的推荐方法是什么?

4

2 回答 2

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

干杯!!

于 2013-10-14T18:34:52.990 回答
1

我假设您的长寿线程在循环中执行一些定期工作。您可以执行以下操作:

  1. 确保池中的每个可运行对象在循环之前检查池的状态。

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

因此,您的 runnable 必须引用其父池。

  1. 使用Runtime.addShutdownHook(). pool.shutdown()然后钩子调用pool.awaitTermination()。池将转换为 SHUTDOWN 状态,最终线程将停止,之后它将转换为 TERMINATED 状态。

--

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

于 2013-10-15T06:19:39.430 回答