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()使停止的线程继续执行.
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();}}}
阅读全文
1 0
- Java多线程核心技术笔记-wait()和notify()
- Java多线程wait()和notify()
- Java多线程wait/notify
- Java多线程之wait()和notify()
- Java多线程之wait()和notify()
- java多线程notify和wait 转载
- [转]java多线程同步,wait和notify
- Java多线程3:wait、notify和notifyAll
- Java多线程的wait()和notify()例子
- Java多线程的wait()和notify()例子
- java 多线程中的 wait 和 notify
- Java多线程8:wait()和notify()/notifyAll()
- java多线程中的wait()和notify()
- java多线程之wait、notify和notifyAll
- Java多线程中wait()和notify()
- Java 多线程通信wait()和notify()案例
- 多线程-notify和wait
- java wait和notify
- QT串口打印以及换行解决
- 初入django6-在页面中正常显示包含html标记的内容
- springboot-restful api-swagger2 ui-实战
- systemd——结构
- 2017夏天之哪凉快去哪里 之六
- Java多线程核心技术笔记-wait()和notify()
- android六边形imageview
- 使用sklearn实现tfidf特征计算
- Tomcat安全漏洞修改总结
- HPU 1192:Sequence(组合数+二进制选数)
- Scan 读取数据按照时区
- 【JSON】JSON概述
- mybatis 大于小于 在XML文件中的使用
- register