繁体   English   中英

Java执行器和长寿命线程

[英]Java Executor and Long-lived Threads

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

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

建议使用什么方式来启动和管理多个线程,每个线程在应用程序的整个生命周期中都存在?

您提到代码正在使用Executors ,它应该返回ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);

ExecutorService是一个Executor ,它提供管理终止的方法以及可以产生Future来跟踪一个或多个异步任务进度的方法。

只要返回的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();

干杯!

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

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

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

    因此,您的可运行对象必须引用其父池。

  2. 使用Runtime.addShutdownHook()安装JVM关闭挂钩。 钩子调用pool.shutdown()然后调用pool.awaitTermination() 池将转换为SHUTDOWN状态,最终线程将停止,此后它将转换为TERMINATED状态。

-

也就是说,我对您的4个线程有点怀疑。 难道不应该只有1个长寿命线程来提取任务并将其提交给执行者服务吗? 您是否真的有4个不同的长期流程? (此考虑与主要问题正交)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM