首页 > 代码库 > Java多线程基础之wait,notify
Java多线程基础之wait,notify
Object类中存在wait()和notify(),notifyAll(),即调用这三个方法时必须要Objecy.wait(),Object.notify()。
使用这三个方法的前提是必须获得该对象的锁,即必须在sychronize方法中执行。
wait()的工作过程是:当线程执行object.wait()时,会释放当前object对象的锁,并进入object对象的等待队列。
notify()的运行过程是:当线程执行object.notify()时,会将object的等待队列中一个随机线程唤醒,notifyAll()则是唤醒object等待队列的所有线程。
我们构造一个实例:两个线程对object对象有同步操作,线程1wait()后,线程2notigy()唤醒线程1,并查看线程的执行过程。
/******************************************************************************* * * COPYRIGHT (C) 2016 Tuniu Limited - ALL RIGHTS RESERVED. * * Creation Date: 2016年9月27日 * *******************************************************************************/package thread;import java.util.concurrent.TimeUnit;/** * @author zhoujie8 * */public class TestWaitNofity { private final static Object object = new Object(); public static void main(String[] args) { Thread1 t1 = new Thread1(); Thread2 t2 = new Thread2(); t1.start(); t2.start(); } public static class Thread1 extends Thread { @Override public void run() { synchronized (object) { System.out.printf("%s %s start\n", System.currentTimeMillis(), Thread.currentThread().getName()); try { System.out.printf("%s %s wait\n", System.currentTimeMillis(), Thread.currentThread().getName()); object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("%s %s end\n", System.currentTimeMillis(), Thread.currentThread().getName()); } } } public static class Thread2 extends Thread { @Override public void run() { synchronized (object) { System.out.printf("%s %s start\n", System.currentTimeMillis(), Thread.currentThread().getName()); object.notify(); System.out.printf("%s %s notify\n", System.currentTimeMillis(), Thread.currentThread().getName()); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }}
输出结果为:
1475030841975 Thread-0 start1475030842000 Thread-0 wait1475030842000 Thread-1 start1475030842000 Thread-1 notify1475030844001 Thread-1 end1475030844001 Thread-0 wait
可以看出:wait()之后,Thread0释放object的锁,并进入等待队列,thread1获得锁,并且唤醒Thread0。
但是需要注意的是:Thread-1 sleep的2S内并没有释放object的锁,所以Thread-0在2S过后才会被唤醒并获取Object锁继续执行。
Java多线程基础之wait,notify
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。