Object的wait和notify方法的使用
使用wait和notify的条件
wait() 与 notify/notifyAll 方法必须在同步代码块中使用,如果不是在同步方法或同步代码块中使用则会报异常
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at com.example.demo.controller.Test3Controller.main(Test3Controller.java:26)
大概意思是:违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
wait() 与 notify/notifyAll() 区别:
当执行wait()时,线程会把持有的锁立即释放,线程处于block状态,调用对应的notify或者notifyAll方法,线程处于runnable状态,竞争到锁和cpu时间就重新执行
wait(100) 线程会把持有的锁立即释放,线程处于block状态,与wait()不同的是,当超过这个设置时间后,线程处于runnable状态,重新竞争锁和cpu时间来执行,当然也可以在线程block时,调用notify使其恢复到runnbale状态
当执行notify/notifyAll方法时,会唤醒处于block状态的线程,直到执行完同步块后再释放锁,所以notify或者notifyAll一般写在末尾
notify 是唤醒一个block线程,使其处于runnable状态,竞争获取到锁和CPU时间后继续执行
notify是唤醒所有的block线程,使他们处于runnable状态,这些线程竞争获取锁和CPU时间后再继续执行
案例:
package com.example.demo.controller;
public class Test3Controller extends Thread{
private static Object c=new Object();
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":线程启动");
synchronized (c) {
try {
System.out.println(Thread.currentThread().getName()+":线程等待");
c.wait();
System.out.println(Thread.currentThread().getName()+":线程被唤醒");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread s=new Test3Controller();
s.start();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"线程开始唤醒"+s.getName()+"线程");
synchronized (c) {
c.notify();
}
}
}
评论区
请写下您的评论...
猜你喜欢
java基础
1910
1.先看一下线程的生命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线程的各种状态之间的转换,而主要是研究一下线程之间的通讯机制,以及Object的wait方法和notify方法。所以
前端(h5)
3331
语法:varmap=newMap();属性:size返回集合中元素的数量方法:clear从映射中移除所有元素。delete从映射中移除指定的元素。forEach对映射中的每个元素执行指定操作。get
blog
线程之间的通讯
java基础
3301
。2.syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法
blog
java使用欧几里得算法计算比例的方法
数据结构与算法
1721
java使用欧几里得算法计算比例的方法 publicstaticvoidmain(String[]args){ System.out.println(bili(2,6
ofc
线程的五种基本状态
official
1111
cpu资源和锁资源)并且释放锁标记,jvm会把该线程放入等待池中,而且不会自动唤醒该线程,必须由其他线程调用同一锁对象的notify方法或notifyAll方法或者wait时间到则该线程进入锁池状态,并根
算法基础
1300
]=0;
System.out.println(a[0]+""+b[0]);
}结果打印的是10说明一位数组的clone方法是深拷贝数组b和数组a并不是同一个对象二位数组的clone方法测试代码public
blog
asm实例对象方法的调用
java基础
3236
asm实例对象方法的调用1.需要的jar包2.我们需要通过asm生成的目标类如下:packageclub.jiajia.test3;publicclassExamp5
java虚拟机(jvm)
2239
jmap是java虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。