Java线程等待唤醒几种方法小结

 更新时间:2023年10月07日 14:47:05   作者:与遨游于天地  
线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify,Condition类中的await、signal,LockSupport类中的park、unpark方法,感兴趣的可以了解一下

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

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

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之后使用,否则无法唤醒。

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生成许可证,并不会抛出异常。他们只和线程关联,且线程最多只能有一个许可证,这意味着每次生成凭证之后,需要等消费完才能继续生成凭证。

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成功
	}

到此这篇关于Java线程等待唤醒几种方法小结的文章就介绍到这了,更多相关Java线程等待唤醒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • java线程之死锁

    java线程之死锁

    这篇文章主要介绍了Java线程之死锁,死锁是这样一种情形-多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止
    2022-05-05
  • SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    SpringBoot学习系列之MyBatis Plus整合封装的实例详解

    MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发、提高效率,这篇文章给大家介绍MyBatis Plus整合封装的实例详解,感兴趣的朋友跟随小编一起看看吧
    2020-08-08
  • Java编程Iterator迭代器设计原理及实现代码示例

    Java编程Iterator迭代器设计原理及实现代码示例

    这篇文章主要介绍了Java编程Iterator迭代器设计原理及实现代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 利用Java多线程技术导入数据到Elasticsearch的方法步骤

    利用Java多线程技术导入数据到Elasticsearch的方法步骤

    这篇文章主要介绍了利用Java多线程技术导入数据到Elasticsearch的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Java基础学习之集合底层原理

    Java基础学习之集合底层原理

    今天带大家回顾Java基础的相关知识,文中对集合底层原理作了非常详细的图文介绍,对Java初学者有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • SpringMVC中Controller类数据响应的方法

    SpringMVC中Controller类数据响应的方法

    这篇文章主要介绍了SpringMVC中的数据响应的问题,主要来了解 Controller 类如何进行数据响应的,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Java Stream比较两个List的差异并取出不同的对象四种方法

    Java Stream比较两个List的差异并取出不同的对象四种方法

    今天开发一个需求时要对A和B两个List集合遍历,并比较出集合A有,而集合B没有的值,下面这篇文章主要给大家介绍了关于Java Stream比较两个List的差异并取出不同对象的四种方法,需要的朋友可以参考下
    2024-01-01
  • 论java如何通过反射获得方法真实参数名及扩展研究

    论java如何通过反射获得方法真实参数名及扩展研究

    这篇文章主要为大家介绍了java如何通过反射获得方法的真实参数名以及扩展研究,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步早日升职加薪
    2022-01-01
  • java实现登录验证码功能

    java实现登录验证码功能

    这篇文章主要为大家详细介绍了java实现登录验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 详解springboot读取yml配置的几种方式

    详解springboot读取yml配置的几种方式

    这篇文章主要介绍了详解springboot读取yml配置的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10

最新评论