Object的wait和notify方法的使用

硅谷探秘者 3587 0 0

使用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基础 1872 1.先看一下线程生命周期转换图(学java此图必背)本篇文章主要目不是分析线程各种状态之间转换,而主要是研究一下线程之间通讯机制,以及Objectwaitnotify。所以
前端(h5) 3281 :varmap=newMap();属性:size返回集合中元素数量:clear从映射中移除所有元素。delete从映射中移除指定元素。forEach对映射中每个元素执行指定操作。get
java基础 3270 。2.syncrhoized加锁线程Objectwait()/notify()/notifyAll()1)wait()、notify()notifyAll()是本地,并且为final
数据结构与算法 1687 java使欧几里得算计算比例 publicstaticvoidmain(String[]args){ System.out.println(bili(2,6
official 1072 cpu资源锁资源)并且释放锁标记,jvm会把该线程放入等待池中,而且不会自动唤醒该线程,必须由其他线程调同一锁对象notify或notifyAll或者wait时间到则该线程进入锁池状态,并根
算法基础 1271 ]=0; System.out.println(a[0]+""+b[0]); }结果打印是10说明一位数组clone是深拷贝数组b数组a并不是同一个对象二位数组clone测试代码public
java基础 3199 asm实例对象1.需要jar包2.我们需要通过asm生成目标类如下:packageclub.jiajia.test3;publicclassExamp5
java虚拟机(jvm) 2196 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 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。