Java - 线程优先级&套接字

时间:2015-02-12 23:37:08

标签: java multithreading

我正在开发一个网络爬虫。程序的每个线程尝试读取3个主机/秒(330ms连接和读取超时)。每个线程的优先级为10(Ubuntu 12.04)。

当我设置10个线程时,爬虫返回150个主机(主机没有超时)。

当我设置400个线程时,爬虫只返回20个主机。我不知道有多少主机真的存在或存在。

我的问题是,是否有可能,一个线程没有在短时间内执行,以及何时它确实需要时间来继续(从CPU调度)套接字已经超时? (因为线程花了太长时间来处理请求)。

如果是这种情况,我必须设置多少个线程,所以所有线程都有相同的时间?

我使用的是ubuntu 12.04 x64 - 桌面,4GB Ram,CPU i5

1 个答案:

答案 0 :(得分:2)

感觉您需要了解Amdahl's Law。基本上,对于N个线程,你的运算速度会小于N倍。您只有一个i5,它可以同时支持2到4个并行任务。由于驱动线程的成本,线程之间的切换以及(如果你没有使用调度程序或线程池)破坏线程,因此在系统上投入的线程比你的系统能够真正处理bogs性能下降更多。

您也无法保证相同的执行时间,因为您依赖外部因素,例如打开该服务器的套接字,以及服务器自身的连接速度。将有比其他服务器慢的服务器,这意味着线程从套接字读取的总时间将比其他服务器慢。

我不能肯定地说你的性能因为推测的IO而变得严重,但我建议进行性能分析和测试。在系统上设置尽可能多的线程,然后在那里工作。尽可能详细地描述您的代码。向它投掷更多线程是个好主意。