【发布时间】:2010-11-12 03:09:16
【问题描述】:
我想用 Java 实现一个线程池,它可以根据提交给它的任务的计算和 I/O 行为动态调整自身大小。
实际上,我想实现与 C# 4.0 中的 new Thread Pool implementation 相同的行为
是否已经有实现,或者我可以通过使用大多数现有的并发实用程序(例如 CachedThreadPool)来实现此行为?
C# 版本进行自我检测以实现最佳利用率。 Java 中提供了哪些自我检测,目前对性能有何影响?
采用协作方法是否可行,其中任务表明其意图(例如进入 I/O 密集型操作,进入 CPU 密集型操作阶段)?
欢迎提出任何建议。
编辑基于 cmets:
目标场景可能是:
- 本地文件抓取与处理
- 网页抓取
- 多网络服务访问和聚合
CachedThreadPool 的问题是它会在所有现有线程都被阻塞时启动新线程——你需要在它上面设置明确的界限,但仅此而已。
例如,我有 100 个 Web 服务要连续访问。如果我创建一个 100 CTP,它将启动 100 个线程来执行操作,并且大量的多个 I/O 请求和数据传输肯定会互相绊倒。对于静态测试用例,我可以进行试验并找出最佳池大小,但我希望它能够自适应地确定并以某种方式应用。
【问题讨论】:
-
我不确定您打算从缩小的线程池中获得什么好处。一个线程什么都不做的成本几乎为零(最大的影响可能来自线程本地缓存)。
-
与 CachedThreadPool 的线程超时选项提供的好处相同。
-
你的意思是像缓存线程池一样吗?默认空闲超时为一分钟,但您可以更改。
-
也许您可以解释您正在寻找的行为?我点击了链接,它只是说它有多酷,但没有说它是什么。
-
不知道为什么要检测线程,也许它在 Java 中与 C# 的含义不同...
标签: c# java concurrency threadpool