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

    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;
		}
		
		
		 @Override
		public 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;
		}
		
		
		 @Override
		public 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();
		}
	}
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值