线程等待唤醒几种方法

线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify;Condition类中的await、signal;LockSupport类中的park、unpark方法。

1、Object类中的wait、notify必须配合Synchronized关键字一起使用,否则会抛出IllegalMonitorStateException异常,并且notify唤醒需要在wait之后,否则无法唤醒。

java 复制代码
	public static void main(String[] args) {

		Object o = new Object();
		new Thread(()->{
			synchronized (o) {
				try {
					o.wait();
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
				System.out.println("被唤醒");
			}
		}).start();

		System.out.println("准备唤醒");
		synchronized (o) {
			o.notify();
		}
   }

2、Condition类中的await、signal必须配合Lock.lock、unlock一起使用,否则会抛出IllegalMonitorStateException异常,并且signal唤醒需要在await之后使用,否则无法唤醒。

java 复制代码
	public static void main(String[] args) {

		Lock reentrantLock = new ReentrantLock();
		Condition condition = reentrantLock.newCondition();

		new Thread(()->{
			reentrantLock.lock();
			try {
				condition.await();
				System.out.println("被唤醒");
			} catch (InterruptedException e) {
				throw new RuntimeException(e);
			} finally {
				reentrantLock.unlock();
			}
		}).start();

		System.out.println("准备唤醒");

		reentrantLock.lock();
		try {
			condition.signal();
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		} finally {
			reentrantLock.unlock();
		}
   }

3、LockSupport类中的park、unpark属于静态方法,unpark会生成许可证,park会消费许可证。先调用park如果未生成许可证,那么会阻塞等待unpark生成许可证,并不会抛出异常。他们只和线程关联,且线程最多只能有一个许可证,这意味着每次生成凭证之后,需要等消费完才能继续生成凭证。

java 复制代码
	public static void main(String[] args) {
		Thread thread = new Thread(() -> {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				throw new RuntimeException(e);
			}
			LockSupport.park();
			System.out.println("被唤醒");
		});
		thread.start();


		System.out.println("准备唤醒");
        //断点可以看到unpark先执行,之后执行park
		LockSupport.unpark(thread);
        //thread.start()在unpark之后无效,线程必须启动才能unpark成功
	}
相关推荐
小物学长几秒前
HJ212-2017 对接与环境在线监测平台设计:报文、CRC、应答、预警和传输有效率
java
171320330计算机毕设编程2 分钟前
计算机毕业设计 基于springboot+vue的在线观鸟视频播放网站 LW PPT
java·大数据·vue.js·spring boot·算法·课程设计
IT枫斗者枫哥3 分钟前
JDBC事务实测:操作日志写入失败时,让客户修改一起回滚
java
OxYGC6 分钟前
Spring 面经系列 · 第 1 篇:Bean 生命周期、单例语义、依赖注入与线程安全
java·安全·spring
小物学长18 分钟前
Java 程序员的 IoT 协议入门(一):物联网平台到底在做什么
java
const_qiu21 分钟前
第四章 07:4.7 本章小结
java·运维·服务器·人工智能
鶴哥只手遮天28 分钟前
Spring AI 2.0.1 深度解析-第 22 章 Spring Boot 集成:自动配置、Properties 与条件装配
java·人工智能·开源
SEO_juper35 分钟前
hreflang 审计工具:外贸多语言站谷歌SEO的隐性杀手
开发语言·人工智能·爬虫·python·seo
WJ.Polar43 分钟前
final、单例类、枚举类、抽象类、接口
java·开发语言