目前,我有一个执行以下操作的构造:
许多X
线程(X
作为用户的可配置变量)都已启动并等待任务可用。线程block
在等待BlockingQueue
。
另一个线程将任务放入阻塞队列中,被阻塞的线程获取任务和run
它们并返回到wait
下一个任务。
无论如何,这很好,但我有以下问题。X
即使 2 小时内没有任何任务,线程也会不断地等待任务。即使只有 X/50 任务进入(即我有比我实际需要的多得多的线程),线程实际上也是可用的
。X
所以我的问题是,我怎样才能重构这个(也许使用Executors
),以便X
根据需要上下波动?
我的目标是不失去性能。我的意思是现在我可以拥有比我需要的更多的线程(浪费资源),但我没有创建新线程的开销。
我有兴趣以一种不浪费资源并保持相同性能水平的方式对其进行重构。
问问题
103 次
3 回答
1
普通的ThreadPoolExecutor就足够了。基本构造函数接受“核心池大小”(始终保持活动的最小线程数量)、最大大小(最大线程数量)和多余线程的保持活动时间(高于核心池大小的空闲线程)的参数。此外,您可以将 BlockingQueue 直接传递给执行程序。
于 2012-08-05T10:42:59.377 回答
0
1.尝试使用CachedThreadPool
,它不仅会回收,而且会在需要时创建新线程..
2.最令人敬畏的特性是CachedThreadPool
当一个线程在 60 秒内不活动时,它会被杀死......所以不会浪费资源。
于 2012-08-05T10:41:33.197 回答
0
您的用例已经在 ExecutorService.newCachedThreadPoolExecutor 中实现。无论如何,我想继续实施,您可以做各种事情来获得灵活的线程池。
我将列出一种这样的可能性
- 编写一个主线程,它持有队列并将工作单元(任务)分配给各个线程,它还维护哪些线程正在运行,哪些已返回结果单元以及哪些线程被阻塞。使用此信息,您的主线程可以轻松地进行负载平衡并在需要时创建/销毁线程(从属)。
于 2012-08-05T11:13:41.520 回答