Object的wait和notify方法的使用

硅谷探秘者 2508 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基础 502 1.先看一下线程生命周期转换图(学java此图必背)本篇文章主要目不是分析线程各种状态之间转换,而主要是研究一下线程之间通讯机制,以及Objectwaitnotify。所以
前端(h5) 2213 :varmap=newMap();属性:size返回集合中元素数量:clear从映射中移除所有元素。delete从映射中移除指定元素。forEach对映射中每个元素执行指定操作。get
数据结构与算法 404 java使欧几里得算计算比例 publicstaticvoidmain(String[]args){ System.out.println(bili(2,6
java基础 2094 。2.syncrhoized加锁线程Objectwait()/notify()/notifyAll()1)wait()、notify()notifyAll()是本地,并且为final
official 81 cpu资源锁资源)并且释放锁标记,jvm会把该线程放入等待池中,而且不会自动唤醒该线程,必须由其他线程调同一锁对象notify或notifyAll或者wait时间到则该线程进入锁池状态,并根
算法基础 240 ]=0; System.out.println(a[0]+""+b[0]); }结果打印是10说明一位数组clone是深拷贝数组b数组a并不是同一个对象二位数组clone测试代码public
java基础 1767 asm实例对象1.需要jar包2.我们需要通过asm生成目标类如下:packageclub.jiajia.test3;publicclassExamp5
java虚拟机(jvm) 527 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
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录