我怎么能在这里集成执行器?或者我怎样才能改进这个线程池?

时间:2012-08-05 10:36:44

标签: java multithreading concurrency threadpool java.util.concurrent

目前我有一个构造可以执行以下操作:
X个线程(X是来自用户的可配置变量)全部启动并等待任务变为可用。线程block在等待 a BlockingQueue
另一个线程将任务放在阻塞队列中,被阻塞的线程接受任务和run,然后返回wait进行下一个任务。
无论如何这工作正常,但我有以下问题。即使两小时内没有任何线程,X个线程也在不停地等待任务 即使只有let'say X / 50任务进入(即我有比我实际需要的更多的线程),X线程实际上也可用。 所以我的问题是,我怎么能重构这个(可能使用Executors),以便X根据需要上下移动?
我的目标不是失去表现。我的意思是现在我可以拥有比我需要更多的线程(浪费资源)但是我没有创建新线程的开销。
我有兴趣以不浪费资源和保持相同性能水平的方式重构它。

3 个答案:

答案 0 :(得分:1)

正常ThreadPoolExecutor就足够了。基本构造函数采用“核心池大小”(始终保持活动的最小线程数),最大大小(最大线程数)和多余线程的保持活动时间(核心池大小以上的空闲线程)的参数。此外,您可以直接为执行者传递BlockingQueue。

答案 1 :(得分:0)

1。尝试使用CachedThreadPool不仅可以回收,还可以在需要时创建新帖子。

2。 CachedThreadPool最棒的功能就是当一个线程在60秒内没有激活它被杀死了....所以不要浪费资源。

答案 2 :(得分:0)

您的用例已在ExecutorService.newCachedThreadPoolExecutor中实现。无论如何,我想继续执行你可以做各种事情来获得灵活的线程池。

我将列出一个这样的可能性

  1. 编写一个主线程,它保存队列并将工作单元(任务)分配给各个线程,还维护哪些线程正在运行,哪些线程返回结果单元以及哪些线程被阻塞。使用此信息,您的主线程可以在需要时轻松地进行负载平衡并创建/销毁线程(从属)。