21,线程8-线程的交互

2018-10-12  本文已影响2人  旅程中

线程的交互
/**

public class ThreadA {  
    public static void main(String[] args) {  
       ThreadB b=new ThreadB();  
       //启动计算线程  
       b.start();  
       //线程A拥有b对象上的锁。线程为了调用wait()或notify()方法,该线程必须是那个对象锁的拥有者  
       synchronized (b) {  //这里传入b对象,只是为了调用b对象的wait方法,等着b线程执行完
           try {  
              System.out.println("等待对象b完成计算......");  
              b.wait();  
           } catch (InterruptedException e) {  
              e.printStackTrace();  
           }  
           System.out.println("b对象计算的总和是:" + b.total);  
       }  
    }  
}  
/** 
 * 计算1+2+3+...+100的和 
 */  
public class ThreadB extends Thread {  
    int total;  
    public void run(){  
       synchronized (this) {  
           for (int i=0;i<101;i++){  
              total+=i;  
           }  
           //(完成计算了)唤醒在此对象监视器上等待的单个线程,在本例中线程A被唤醒  
           notify();  
       }  
    }  
}  
    执行结果:
等待对象b完成计算......  
b对象计算的总和是:5050  

调用wait方法的线程,不会自己唤醒,需要线程调用 notify / notifyAll 方法唤醒等待池中的所有线程,才会进入就绪队列中等待系统分配资源。

Wait和join用法差不多

上一篇 下一篇

猜你喜欢

热点阅读