博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每个java程序都至少有一个线程给主线程,java程序在主线程中判断各个子线程状态的操作,该如何解决...
阅读量:1533 次
发布时间:2019-04-21

本文共 1150 字,大约阅读时间需要 3 分钟。

java程序在主线程中判断各个子线程状态的操作

每个子线程在队列为空时会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 这个地方会不会出现没判断完小括号里语句的就跳转到子线程了?那不就有可能出错了吗,我查了下有说不是原子操作的话就可能会出错,那我这样写正确吗,怎么实现原子操作,如何达到准确判断的要求?

------解决方案--------------------

引用:Quote: 引用:把你的思路换一下。

wait是可以超时的,你可以变成子线程在等3*10秒之后取不到URL就超时。

然后你只需要在wait这里判断一下就可以了。

那是在wait(30000)括号里加时间?可是时间到了自动就醒了又重新循环了啊,怎么确定是自己醒的还是被唤醒的呢,还是不太明白你说的,应该在哪里判断?给个例子最好了

要判断是外面notify还是超时,其实也很简单。

如果是外面的notify,那至少会有两个现像:

1. wait前后的时间差应该<30000

2. 应该有足够让你继续工作下去的条件,如拿到url .

按此两个规则,随便找一个去判断即可。

转载地址:http://zaddy.baihongyu.com/

你可能感兴趣的文章
常用Linux命令
查看>>
Weblogic漏洞复现——XML Decoder(CVE-2017-10271)
查看>>
Webug4.0显错注入
查看>>
渗透测试流程
查看>>
SQL练习(less-2)报错注入
查看>>
VMware虚拟机安装Debian
查看>>
PC机win10练习v-P-n连接 虚拟机Win2003
查看>>
虚拟机-安装VMware Tools
查看>>
xshell连接VM centOS7
查看>>
bat脚本交互动态输入端口启动jar包
查看>>
mysql单个字段查询时设置是否区分大小写
查看>>
整合vue开发H5+跨平台app (以开发语音识别为例)
查看>>
windows自带的网络调试工具整理
查看>>
自定义一个Chrome翻译插件
查看>>
JMX获取jvm参数,cpu使用率,内存,线程,类等信息,实现一个简单的web版jvisualvm
查看>>
motan rpc 接口统一异常处理
查看>>
解析文件入库乱码问题解决
查看>>
clickhouse 条件语句内decimal除0报错处理
查看>>
应用启动后立马自动停了怎么处理
查看>>
Java motan网关设计
查看>>