当前位置: 技术问答>java相关
一个多线程搜索主机名(或IP地址)的问题
来源: 互联网 发布时间:2015-06-04
本文导语: main()中建立一Vector pool存放全部待搜索的IP地址(设有50个),并创建5个线程,每个线程从pool中获取ip地址来搜索主机名,搜索结束后并不停止线程,继续从pool取IP,知道pool为空。 线程程序如下: public void run()...
main()中建立一Vector pool存放全部待搜索的IP地址(设有50个),并创建5个线程,每个线程从pool中获取ip地址来搜索主机名,搜索结束后并不停止线程,继续从pool取IP,知道pool为空。
线程程序如下:
public void run()
{
while (nIPSearched != nIP)
{
synchronized (pool)
{
while (pool.isEmpty())
{
if (nIPSearched == nIP) return;
try {
pool.wait();
}
catch (InterruptedException e) { }
}
String cIP = (String)pool.remove(pool.size()-1);
try {
InetAddress address = InetAddress.getByName(cIP);
String hostName = address.getHostName();
this.incrementIPSearched();
searchResult.add(hostName);
this.incrementComputerFounded();
}
catch (UnknownHostException e) {
System.out.println("wrong");
}
}
} // end first while
} // end run
设线程名分别是1,2,3,4,5。pool中的ip分别是a,b,c,d,e;f,g,h,i,j.....。
第一次从pool中取ip(a,b,c,d,e)后,线程1,2,4,5搜索任务较慢,运行时间长。线程3(任务c)搜索很快。我的问题是:线程3下次是取的是任务怎么是h,而不是g。
线程程序如下:
public void run()
{
while (nIPSearched != nIP)
{
synchronized (pool)
{
while (pool.isEmpty())
{
if (nIPSearched == nIP) return;
try {
pool.wait();
}
catch (InterruptedException e) { }
}
String cIP = (String)pool.remove(pool.size()-1);
try {
InetAddress address = InetAddress.getByName(cIP);
String hostName = address.getHostName();
this.incrementIPSearched();
searchResult.add(hostName);
this.incrementComputerFounded();
}
catch (UnknownHostException e) {
System.out.println("wrong");
}
}
} // end first while
} // end run
设线程名分别是1,2,3,4,5。pool中的ip分别是a,b,c,d,e;f,g,h,i,j.....。
第一次从pool中取ip(a,b,c,d,e)后,线程1,2,4,5搜索任务较慢,运行时间长。线程3(任务c)搜索很快。我的问题是:线程3下次是取的是任务怎么是h,而不是g。
|
没看懂你想干什么,但用synchronized一直锁定pool对并行效率很不利
|
你的 notify()在哪里?
如jimjxr(宝宝猫) 所说,你这样的处理并不能提高多大效率,大家都得等待 pool的锁,不如模仿 NetAnts等的方法,把IP地址分成5份,各分给5个线程去查找 hostname.
如jimjxr(宝宝猫) 所说,你这样的处理并不能提高多大效率,大家都得等待 pool的锁,不如模仿 NetAnts等的方法,把IP地址分成5份,各分给5个线程去查找 hostname.