线程的交互
/**
- 计算输出其他线程锁计算的数据
*/
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用法差不多
网友评论