我有两个不做太多计算的 IO 密集型进程:一个是获取和解析网页,另一个是将通过解析获得的一些数据存储在数据库中。当网络继续爬行时,这将重复。
是否有一种方法可以动态地添加和减去正在处理每个任务的线程数,以便性能对于整个系统运行的机器而言是最佳的?该方法不应涉及基准测试,因为它将分发到我无法事先访问的许多机器上。
请指导我一些来源或信息。
我有两个不做太多计算的 IO 密集型进程:一个是获取和解析网页,另一个是将通过解析获得的一些数据存储在数据库中。当网络继续爬行时,这将重复。
是否有一种方法可以动态地添加和减去正在处理每个任务的线程数,以便性能对于整个系统运行的机器而言是最佳的?该方法不应涉及基准测试,因为它将分发到我无法事先访问的许多机器上。
请指导我一些来源或信息。
而不是直接使用线程,您应该只创建一个ThreadPool
向其中添加一些Runnable
执行实际工作的 s 。根据您的描述,CachedThreadPool可能是合适的。查看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html了解如何实施的一些指南。
那么动态调整线程数应该没问题(例如使用ThreadPoolExecutor )。
但在我看来,最佳线程数受到两个因素的限制:
我不确定下载部分是否应该是多线程的,因为每个线程只会从其他线程窃取带宽,除非页面非常小。