java wait(),notify(),notifyAll()

  1. wait()的作用是使当前执行代码的线程进行等待,此方法是Object类的方法,该方法用来将当前线程置入“预执行队列”中,并且在wait()所带的代码处停止执行,直到接到通知或被中断位置。在调用wait()方法前线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。
  2. notify()也要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁。该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个wait状态的线程,对其发出notify通知。在执行notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后才会释放锁。
  3. notifyAll()方法是唤醒全部线程。
  4. 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

 

posted @ 2018-05-31 18:57  L狗哥  阅读(144)  评论(0编辑  收藏  举报