动态优化线程数

时间:2013-05-17 16:37:14

标签: java multithreading io web-crawler

我有两个不需要太多计算的IO密集型进程:一个是获取和解析一个网页,另一个是将一些通过解析获得的数据存储在数据库中。当网页爬行继续时,这将重复。

是否有一种方法可以动态地添加和减去每个任务上正在处理的线程数,从而使整个系统运行的机器的性能最佳?该方法不应涉及基准测试,因为它将被分发到我预先无法访问的许多机器上。

请指导我一些来源或信息。

2 个答案:

答案 0 :(得分:2)

您应该只创建一个ThreadPool,而不是直接使用线程,您可以添加一些Runnable来执行实际工作。根据您的说明,CachedThreadPool可能适合。查看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html了解如何实施的一些指导原则。

答案 1 :(得分:1)

动态调整线程数应该没问题(例如使用ThreadPoolExecutor)。

但在我看来,最佳线程数受两个因素的限制:

  1. “下载主题”的网络带宽
  2. “数据库线程”允许的最大数据库连接数
  3. 我不确定下载部分是否应该是多线程的,因为除非页面非常小,否则每个线程都会窃取其他线程的带宽。