Java多线程核心技术笔记-wait()和notify()

来源:互联网 发布:统计分析软件市场规模 编辑:程序博客网 时间:2024/05/16 13:42
    wait()方法,作用是使执行当前代码的线程进行等待,wait()方法是Object类的方法,在调用wait()方法之前,线程必须获得该对象的对象级别的锁,所以只能在同步方法或同步块中使用wait()方法,一旦调用了wait()方法,则立马释放该对象锁.
    notify()方法,也只能在同步方法或者在同步代码块调用,调用前,线程必须获得该对象的对象级别锁,如果调用notify()方法没有持有适当的锁,跟wait()方法一样会抛出ILLegalMonitorStateException异常,调用notify()方法后会唤醒那些可能等待该对象锁的其他线程,如果多个线程等待,随机挑选一个呈wait()状态的的线程,对其发出通知notify(),在执行notify()后,不会马上释放对象锁,呈wait()状态的线程并不能立马获得对象锁,需要等待执行notify()方法的线程将程序执行完,退出synchronized代码块后,当前线程才会释放,且呈wait状态所在的线程才可以获得对象锁继续执行后面代码,如果该对象没有再次调用notify()方法的话,其他呈wait状态的线程因为没有得到通知,所以会一直等待下去,还会阻塞在wait状态.
    一句话总结就是,wai()使线程停止运行,释放对象锁,而notify()使停止的线程继续执行.

    下面看看代码

package com.test.theread.message;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;public class Test2 {public static void main(String[] args) {try {Class clazz = Test2.class;Object obj = clazz.newInstance();Method method = clazz.getMethod("doRun");method.invoke(obj);} catch (Exception e) {e.printStackTrace();}}public void doRun() throws Exception{Object lock = new Object();ThreadB b = new ThreadB(lock);b.start();Thread.sleep(50);ThreadA a = new ThreadA(lock);a.start();}private class ThreadA extends Thread{private Object lock;public ThreadA(Object lock){super();this.lock = lock;} @Overridepublic void run() {try {synchronized (lock) {for(int i=1; i<=10; i++){MyList.add();if(i == 5){//唤醒在等待的线程,但是不会立马释放锁,需要等待该现场执行完后释放lock.notify();System.out.println("发出通知");}System.out.println("添加了 "+i+" 个元素");Thread.sleep(1000);}}} catch (Exception e) {e.printStackTrace();} }}private class ThreadB extends Thread{private Object lock;public ThreadB(Object lock){super();this.lock = lock;} @Overridepublic void run() {try {synchronized(lock){if(MyList.size() != 5){System.out.println("wait begin ---------");//进入等待,立刻释放锁lock.wait();System.out.println("wait end -----------");}}} catch (Exception e) {e.printStackTrace();} }}private static class MyList{private static List<String> list = new ArrayList<String>();public static void add(){list.add("hj");}public static int size(){return list.size();}}}


原创粉丝点击