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

java thread wait的用法
大家看下
代码:

/**
 * 计算输出其他线程锁计算的数据
 * 
 * @author leizhimin 2008-9-15 13:20:38
 */
public class ThreadA {
  public static void main(String[] args) {
  ThreadB b = new ThreadB();
  // 启动计算线程
  b.start();
   
synchronized (b) {
  try {
  System.out.println("等待对象b完成计算。。。");
  // 当前线程A等待
  b.wait();
   
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  System.out.println("b对象计算的总和是:" + b.total);
  }
  }
}
/**
 * 计算1+2+3 ... +100的和
 * 
 * @author leizhimin 2008-9-15 13:20:49
 */
public class ThreadB extends Thread {
  int total;

  public void run() {
  synchronized (this) {
  for (int i = 0; i < 101; i++) {
  total += i;
  }
   
  // (完成计算了)唤醒在此对象监视器上等待的单个线程,在本例中线程A被唤醒
  notify();
  }
  }
}

大家看下蓝字部分,
这程序执行到篮字部分,表示什么意思哦?我不明白这样的用法
还有红字部分
b.wait()应该是让b线程释放执行权吧,那为什么还执行b线程中的代码哦?


------解决方案--------------------
偶是这么理解的。
synchronized (b) 导致了b上开启了同步锁。也就是说
只要存在 synchronized (b) 就会等待解锁。
也就是说A里的synchronized(b) {} 就是为了防止在执行的时候 B里的synchronized (this) { } 代码段同时执行。

来个时间线。
1. A: synchronized (b) { 
(这时候拿到b的锁,其他同步段不能执行,在等待中)
2. try {
System.out.println("等待对象b完成计算。。。"); 
b.wait(); 
(这时候A放弃b锁,让B执行)
3. B: synchronized (this) { 
for (int i = 0; i < 101; i++) { 
total += i; 

notify(); 
(唤醒A)
4. A:继续执行。