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 还不能全部恢复吗??
谢谢各位

解决方案 »

  1.   

    从代码看应该是都被唤醒了,就是你说的恢复了。  你说不是都恢复了,我比较怀疑,贴上打印信息看看。
    但是有个概念你好像搞错了。
    ”这个问题很奇怪 notify是随机恢复的 难道我掉30次notify 还不能全部恢复吗??“30个都恢复,并不是因为你notify了30次,并且每次随机唤醒一个。
    实际上,每次你调用一次loaders[i].Resume(),就是唤醒固定的loaders[i]这个线程。 因为每个线程都是以自己这个对象做锁,就是说30个线程就有30把锁。
    附一句:wait();是Object的方法,不要勿以为是Thread的方法了。
      

  2.   

    奇怪了 实际情况是再loaders[i].Resume(); 三十次后 
    并不是所有线程都被唤醒 继续执行step2啊
      

  3.   

    在   callStep2() 前面打个log,
    System.out.printlt("Thread " + this.getName() +" resumed.");