日期:2014-05-20  浏览次数:20694 次

java 中关于线程同步的问题
class All implements Runnable
  { int i=0;
  String name;
  public void run()
  { while(true)
  { i++;
  /* if(i==11)
  { try{wait();}
  catch(Exception e){}  
  }*/
  System.out.println(name+"i="+i);
  if(i==5)
  { try {挂起线程();}
  catch(Exception e){}
  }
  try{Thread.sleep(1000);}
  catch(Exception e){} 
 
  }
 
  }
  public synchronized void 挂起线程()throws InterruptedException
  { wait();
  }
  public synchronized void 恢复线程()
  { notifyAll();
 
  }
  }
public class WaitExa 
 {
  public static void main(String[] args) 
{ int m=0;
All target=new All();
target.name="张三";
Thread thread=new Thread(target);
thread.start();
while(true)

m++;
System.out.println("我是主线程m="+m);
if(m==10)
{ System.out.println("让"+thread.getName()+"继续工作");
try{target.恢复线程();}
catch(Exception e){}
break;
}
try{Thread.sleep(1000);}
catch(Exception e){} 
 
}  


}

}



上面的线程是是实现 thread 每隔一秒输出一整数,输到5后,该线程挂起。主线程每隔一秒输出一个整数,输出20个后,让thread调用notifyAll()方法。始线程继续执行。public synchronized void 挂起线程()throws InterruptedException
中的关键字synchronized 去掉后,为什么wait()不起作用?还有/* if(i==11) { try{wait()};catch(Exception){} }*/
我把注释去掉,这段代码也没起作用,怎样使 thread输到11时再次挂起??

------解决方案--------------------
wait()方法必须在同步方法或块里起作用. 
不在同步方法或块里不起作用.

象你的程序,把注释去掉,你希望wait()执行后进入等待,可你的这段程序不是同步的,没有同步对象锁,所以线程调度无法把它放入阻塞池里,程序将继续执行.

如果你想让这段程序起作用,还得用"挂起线程()".

而你想这时挂起, 但这时因为主线程已经退出了, thread 线程就一直等了,没有人唤醒了.