Java线程等待唤醒几种方法小结
线程等待和唤醒有三种实现方法,分别是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线程等待唤醒内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot学习系列之MyBatis Plus整合封装的实例详解
MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发、提高效率,这篇文章给大家介绍MyBatis Plus整合封装的实例详解,感兴趣的朋友跟随小编一起看看吧2020-08-08利用Java多线程技术导入数据到Elasticsearch的方法步骤
这篇文章主要介绍了利用Java多线程技术导入数据到Elasticsearch的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-07-07Java Stream比较两个List的差异并取出不同的对象四种方法
今天开发一个需求时要对A和B两个List集合遍历,并比较出集合A有,而集合B没有的值,下面这篇文章主要给大家介绍了关于Java Stream比较两个List的差异并取出不同对象的四种方法,需要的朋友可以参考下2024-01-01
最新评论