多个线程依次调用wait暂停,然后再依次调用notify重启,为什么最后一个线程总是无法重启?

xiaoge22275 2015-11-14 09:28:15
我在主程序中创建多个线程执行同一任务,当某一条件满足时时,主程序会依次使所有线程执行wait方法暂停,当另一条件满足时,再依次使所有线程执行notify方法重启。当线程数大于1的时候,总会有一个线程是无法重启的,不知道是什么原因,急坏了。

public class MyThread extends Thread {
private Object control = new Object();
@Override
public void run() {
do {
synchronized(control) {
if(this.suspendFlag == true) {
try {
control.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//do something...
} while(...);
}

public void setSuspend(boolean suspendFlag) {
if(suspendFlag == false) {
synchronized(control) {
control.notify();
}
}
this.suspendFlag = suspendFlag;
}
}
...全文
171 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoge22275 2015-11-18
  • 打赏
  • 举报
回复
1、To:cscxxx:每次不能重启的线程有什么相似点? 没有任何相似点,就是随机会有一个永远停在执行wait()的地方,所有线程我是放在数组里的,遍历通知所有线程暂停或重启。 2、To:wzdxt:这段代码没问题,问题应该出在主程序中 主程序正常通知所有线程重启,就是一定会有一个没办法重启,真是好纳闷。 3、To:skgary:你需要变更的变量在居然同步块之外,这个在写多线程的时候很有可能有问题 这个怎么理解呢?你指的是那个标志变量吗?线程类里有个方法供主程序调用,用来通知暂停或者重启。
skgary 2015-11-17
  • 打赏
  • 举报
回复
你需要变更的变量在居然同步块之外,这个在写多线程的时候很有可能有问题。 当然,未必是这个问题导致的。
cscxxx 2015-11-16
  • 打赏
  • 举报
回复
每次不能重启的线程有什么相似点?依照这个思路找看看
tony4geek 2015-11-16
  • 打赏
  • 举报
回复
调试看看。。
wzdxt 2015-11-16
  • 打赏
  • 举报
回复
这段代码没问题,问题应该出在主程序中

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧