文章目录
参考资料
线程间互相通信的过程,就是线程间的协作
Java中,线程协作的两种常见方式:
- Object.wait(),Object.notify()
- Condition
1 wait(),notify(),notifyAll
wait(),notify(),notifyAll() 是 Object类
中的 方法
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
- wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写
- 调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)
- 调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程
- 调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程
- 这 3个方法,必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)
注意:
- notify()和notifyAll()方法只是唤醒等待该对象的monitor的线程,并
不决定哪个线程能够获取到monitor
- 一个线程被唤醒不代表立即获取了对象的monitor,只有等调用完notify()或者notifyAll()并
退出synchronized块
,释放对象锁
后,其余线程才可获得锁执行
示例:
public class MonitorTest {
public static Object object = new Object();
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
try{
Thread.sleep(200);
} catch (InterruptedException e){
e.printStackTrace();
}
thread2.start();
}
static class Thread1 extends Thread{
public void run(){
synchronized (object){
try{
object.wait();
} catch (InterruptedException e){
}
System.out.println("线程"+ Thread.currentThread().getName()+"获取到锁");
}
}
}
static class Thread2 extends Thread