Java多线程基础之wait,notify

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 start
1475030842000 Thread-0 wait
1475030842000 Thread-1 start
1475030842000 Thread-1 notify
1475030844001 Thread-1 end
1475030844001 Thread-0 wait

 

可以看出:wait()之后,Thread0释放object的锁,并进入等待队列,thread1获得锁,并且唤醒Thread0。

但是需要注意的是:Thread-1 sleep的2S内并没有释放object的锁,所以Thread-0在2S过后才会被唤醒并获取Object锁继续执行。

以上是关于Java多线程基础之wait,notify的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程系列---“基础篇”05之 线程等待与唤醒

Java多线程系列---“基础篇”14之 wait,sleep,join,yield,park,unpark,notify等通信机制对比

Java——多线程高并发系列之wait()notify()notifyAll()interrupt()

Java——多线程高并发系列之wait()notify()notifyAll()interrupt()

Java 多线程编程之:notify 和 wait 用法

JAVA多线程之wait/notify