java程序在主线程中判断各个子线程状态的操作,该如何解决
java程序在主线程中判断各个子线程状态的操作
每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是wait状态的话,则终止子线程并退出,该如何判断?下面主线程中我用if判断执行时主线程会被子线程在某一时刻抢走出现错误的wait判断(也就是判断时恰好是等其他线程的wait,这个时刻并不是所有子线程都wait了)吗?
——1 这个地方会不会出现没判断完小括号里语句的就跳转到子线程了?那不就有可能出错了吗,我查了下有说不是原子操作的话就可能会出错,那我这样写正确吗,怎么实现原子操作,如何达到准确判断的要求?
------解决方案--------------------
要判断是外面notify还是超时,其实也很简单。
如果是外面的notify,那至少会有两个现像:
1. wait前后的时间差应该<30000
2. 应该有足够让你继续工作下去的条件,如拿到url .
按此两个规则,随便找一个去判断即可。
每个子线程在队列为空时会wait等待其他线程添加新url到队列,到最后所有子线程都取不到url时也会都wait住,要在主线程中判断如果所有的子线程都是wait状态的话,则终止子线程并退出,该如何判断?下面主线程中我用if判断执行时主线程会被子线程在某一时刻抢走出现错误的wait判断(也就是判断时恰好是等其他线程的wait,这个时刻并不是所有子线程都wait了)吗?
//子线程中:
public void run() {
while(true)
{
String visitingUrl = (String) getAUrl(); //从队列中同步的取一条url
if(visitingUrl==null){ //队列为空
synchronized(signal){ //等待其他线程向队列中添加新url的信号
try {
signal.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
......
......
}
}
//主线程中:
//监控线程队列里的每个线程的状态
while(flag){
......
if(threadsList.get(0).getState().equals("WAITING")
&& threadsList.get(1).getState().equals("WAITING")
&& threadsList.get(2).getState().equals("WAITING")){ ——1
flag=false;
}else{
Thread.sleep(2000);
}
......
}
——1 这个地方会不会出现没判断完小括号里语句的就跳转到子线程了?那不就有可能出错了吗,我查了下有说不是原子操作的话就可能会出错,那我这样写正确吗,怎么实现原子操作,如何达到准确判断的要求?
------解决方案--------------------
要判断是外面notify还是超时,其实也很简单。
如果是外面的notify,那至少会有两个现像:
1. wait前后的时间差应该<30000
2. 应该有足够让你继续工作下去的条件,如拿到url .
按此两个规则,随便找一个去判断即可。