java thread notify恢复挂起线程的问题

huangyue158 2010-09-08 03:24:59
java 的开很多线程中 使用wait把每个线程都挂住 但使用notify能确保每个线程都正常resume吗
实际我试验的结果 貌似是不能完全恢复啊
举个简单的例子
public class TestThread extends Thread{
public void run(){ //假设run部分分三步,每一部分都是复杂的操作,而且每次每次做完后 都需要挂住 等待
callStep1()
WaitSyn()
callStep2()
WaitSyn()
callStep3()
}

public synchronized void WaitSyn(){
try {
wait(); //这样把每个线程都挂住
}catch(InterruptedException e)
{
e.printStackTrace();
}
}

public void Resume(){
synchronized(this){
notify(); //书上说 notify会随机的恢复一个挂起的线程
}
}

}


public static void main(String args[]){
int NUM=30; //假设线程开很多 这里就开30个
TestThread []loaders=new TestThread[NUM];
for(int i=0;i<NUM;i++)
{
loaders[i]=new TestThread(i+"");
loaders[i].start(); //直接运行 运行完step1后会挂住
}
try{
Thread.currentThread().sleep(10000); //这部分就是等待一段时间 再全部恢复线程 再10秒内 step1已完成
}catch(Exception e){
e.printStackTrace();
}
for(int i=0;i<NUM;i++)
{
loaders[i].Resume(); //将挂住的30个线程都恢复???? 但问题是貌似30个线程不能完全恢复啊 只能恢复十几个 或二十几个 每次都不会完整的恢复30个线程继续执行step2

}
}

这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??
谢谢各位
...全文
220 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mybeautiful 2010-09-08
  • 打赏
  • 举报
回复
在 callStep2() 前面打个log,
System.out.printlt("Thread " + this.getName() +" resumed.");
huangyue158 2010-09-08
  • 打赏
  • 举报
回复
奇怪了 实际情况是再loaders[i].Resume(); 三十次后
并不是所有线程都被唤醒 继续执行step2啊
Mybeautiful 2010-09-08
  • 打赏
  • 举报
回复
从代码看应该是都被唤醒了,就是你说的恢复了。 你说不是都恢复了,我比较怀疑,贴上打印信息看看。


但是有个概念你好像搞错了。
”这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??“

30个都恢复,并不是因为你notify了30次,并且每次随机唤醒一个。
实际上,每次你调用一次loaders[i].Resume(),就是唤醒固定的loaders[i]这个线程。 因为每个线程都是以自己这个对象做锁,就是说30个线程就有30把锁。


附一句:wait();是Object的方法,不要勿以为是Thread的方法了。

62,615

社区成员

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

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