LockSupport 可以用于阻塞当前线程的执行,以及唤醒指定的线程,常用的方法包括park() 和 unpark(thread),能精确控制线程,比 Object 的 wait 和 notify 方法更灵活。

public class LockSupportTest {public static void main(String[] args) {Thread thread = new Thread(() -> {for (int i=0; i<20; i++) {System.out.println(i);if (i == 5) {/** 歇一会儿吧 */LockSupport.park();}if (i == 18) {/** 歇一会儿吧 */LockSupport.park();}try {TimeUnit.SECONDS.sleep(1);System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();try {/** 主线程sleep 10 秒*/TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}/** 唤醒 thread 线程*/LockSupport.unpark(thread);try {/** 主线程sleep 5 秒*/TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}/** 唤醒 thread 线程*/LockSupport.unpark(thread);}
}

输出结果:

0
2021-07-19 12:06:31
1
2021-07-19 12:06:32
2
2021-07-19 12:06:33
3
2021-07-19 12:06:34
4
2021-07-19 12:06:35
5
2021-07-19 12:06:41
6
2021-07-19 12:06:42
7
2021-07-19 12:06:43
8
2021-07-19 12:06:44
9
2021-07-19 12:06:45
10
2021-07-19 12:06:46
11
2021-07-19 12:06:47
12
2021-07-19 12:06:48
13
2021-07-19 12:06:49
14
2021-07-19 12:06:50
15
2021-07-19 12:06:51
16
2021-07-19 12:06:52
17
2021-07-19 12:06:53
18
2021-07-19 12:06:54
19
2021-07-19 12:06:55

解释一下:

park() 方法不需要加锁就可以实现线程的阻塞,unpark() 方法实现线程的唤醒。

unpark()方法如果先于park方法被调用,则不会阻塞线程,例如上面代码在i==18的时候没有阻塞,直接继续打印了,因为在此之前主线程已经调用了 unpark 方法唤醒 thread 线程了。

Java 并发编程之 LockSupport相关推荐

  1. 并发编程之LockSupport的 park 方法及线程中断响应

    系列文章目录 Java并发编程技术知识点梳理(第一篇)操作系统底层工作的整体认识 Java并发编程技术知识点梳理(第二篇)并发编程之JMM&volatile详解 Java并发编程技术知识点梳理 ...

  2. zbb20180929 thread java并发编程之Condition

    java并发编程之Condition 引言 在java中,对于任意一个java对象,它都拥有一组定义在java.lang.Object上监视器方法,包括wait(),wait(long timeout ...

  3. java并发编程之4——Java锁分解锁分段技术

    转载自 java并发编程之4--Java锁分解锁分段技术 并发编程的所有问题,最后都转换成了,"有状态bean"的状态的同步与互斥修改问题.而最后提出的解决"有状态bea ...

  4. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  5. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  6. Java并发编程之CAS第三篇-CAS的缺点

    Java并发编程之CAS第三篇-CAS的缺点 通过前两篇的文章介绍,我们知道了CAS是什么以及查看源码了解CAS原理.那么在多线程并发环境中,的缺点是什么呢?这篇文章我们就来讨论讨论 本篇是<凯 ...

  7. Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier ...

  8. java并发编程之AbstractQueuedSynchronizer

    引言 AbstractQueuedSynchronizer,队列同步器,简称AQS,它是java并发用来构建锁或者其他同步组件的基础框架. 一般使用AQS的主要方式是继承,子类通过实现它提供的抽象方法 ...

  9. Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析

    自己一个人随便看看源码学习的心得,分享一下啦,不过我觉得还是建议去买本Java并发编程的书来看会比较好点,毕竟个人的理解有限嘛. 独占锁和共享锁 首先先引入这两个锁的概念: 独占锁即同一时刻只有一个线 ...

最新文章

  1. 图论--欧拉路,欧拉回路(小结)
  2. Vue 模板语法 插值操作 绑定属性 计算属性 事件监听 条件判断 循环遍历 阶段案例
  3. 获取用户列表为空_Python中最常见的10个列表操作
  4. nssl1338-逃亡路径【最短路计数,bfs】
  5. 0 0/2 * * * ? linux文本含义,Linux基础2.0
  6. 基于WF4的新平台-流程模式-(9)表单路由启动传入
  7. find命令用法集锦
  8. Android MediaPlayer的生命周期
  9. 靠政府补贴实现华丽财报的科大讯飞,它背后蕴含着怎样的生机
  10. 乒乓球单循环赛_乒乓球淘汰赛制和单循环赛制的比赛方法是什么?
  11. 超全汇总,常见的芯片封装大全-道合顺大数据infinigo
  12. 纸飞机飞行曲线matlab,从小到大只会做个纸飞机?关于折纸的「高端」技巧通通告诉你...
  13. python 调用scp命令 实践
  14. 微信公众平台如何授权第三方平台,干货到!微信公众号怎样添加第三方平台及取消授权
  15. 捕鱼问题 matlab,鱼捕捞问题(数学建模).docx
  16. 1个免费网站教你如何追踪微信实时热点,速速收藏
  17. Ubuntu 16.04.4 配置 Nvidia显卡驱动 + CUDA 9.0 + cuDNN v7.0.5 + OpenCV 3.2.0
  18. android cmwap 切换 cmnet,Android CMWAP和CMNET 切换APN
  19. 基于CNN的花卉识别
  20. SpringBoot实现发送QQ邮箱功能

热门文章

  1. 【英语学习】【WOTD】condone 释义/词源/示例
  2. python 读取jpg文件是yuv_Python读取YUV文件,并显示的方法
  3. Qt creator 中文显示问题(常量中有换行符或中文显示乱码)
  4. python 文件管理_python 文件操作
  5. echarts 3d地图_独占进博会800m2展厅!3D炫酷光影秀带你邂逅金山往事..._政务_澎湃新闻...
  6. php display block,CSS display (block inline none )常见属性和用法教程
  7. 为什么说区块链是具有革命性意义的?
  8. cf244D. Match amp; Catch 字符串hash (模板)或 后缀数组。。。
  9. 学习日志---矩阵表示及特殊矩阵压缩
  10. ikvm.net简介