java wait(),notify(),notifyAll()
- wait()的作用是使当前执行代码的线程进行等待,此方法是Object类的方法,该方法用来将当前线程置入“预执行队列”中,并且在wait()所带的代码处停止执行,直到接到通知或被中断位置。在调用wait()方法前线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。
- notify()也要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁。该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个wait状态的线程,对其发出notify通知。在执行notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后才会释放锁。
- notifyAll()方法是唤醒全部线程。
- wait(long) 带一个参数的方法是等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒.
实例代码:
package com.test; public class MyThread1 extends Thread { private Object lock; public MyThread1(Object lock) { this.lock = lock; } @Override public void run() { try { synchronized (lock) { System.out.println("开始 wait time=" + System.currentTimeMillis()); lock.wait(); System.out.println("结束 wait time=" + System.currentTimeMillis()); } } catch (Exception e) { e.printStackTrace(); } } }
package com.test; public class MyThread2 extends Thread { private Object lock; public MyThread2(Object lock) { this.lock = lock; } @Override public void run() { synchronized (lock) { System.out.println("开始 notify time=" + System.currentTimeMillis()); lock.notify(); System.out.println("结束 notify time=" + System.currentTimeMillis()); } } }
package com.test; public class Run { public static void main(String[] args) { try { Object lock = new Object(); MyThread1 t1 = new MyThread1(lock); t1.start(); Thread.sleep(3000); MyThread2 t2 = new MyThread2(lock); t2.start(); } catch (Exception e) { e.printStackTrace(); } } }
运行结果: 开始 wait time=1527763145089 开始 notify time=1527763148090 结束 notify time=1527763148090 结束 wait time=1527763148090