1.背景

面试官问,如何暂停一个线程勒.....

说说你对park的理解.......

2.代码

package com.ldp.demo01;

import com.common.MyThreadUtil;
import lombok.extern.slf4j.Slf4j; import java.util.concurrent.locks.LockSupport; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/01 10:58
* @description <p>
* park & unpark 与 wait & notify 相比
* 1.wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
* 2.park & unpark 是以线程为单位来 阻塞 和 唤醒 线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么 精确
* 3.park & unpark 可以先 unpark,而 wait & notify 不能先 notify
* </p>
*/
@Slf4j
public class Test04UnPark {
/**
* 1.先park在unPark
* 2.先unPark 在park---(会导致第一次park无效)
* <p>
* park的理解(非常重要)
* <p>
* 每个线程都有自己的一个 Parker 对象,
* 由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
* <p>
* 直接解释就是:
* 每个线程都有自己的一个 Parker 对象,
* 由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
* <p>
* <p>
* 当调用 park想暂停线程时
* 如果在这之前没有调用unpark,就直接暂停当前线程.
* 如果在这之前调用了unpark,线程继续运行,相当于这个park无效.
* <p>
* <p>
* 当调用 unpark想让线程继续运行时
* 如果线程是处于暂停状态,线程被唤醒开始执行;
* 如果线程本来就处于运行状态,线程继续运行,并且会记住这次unpark,线程下次park时无效.
* 多次调用unpark时仅一次unpark有效.
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
log.info("t1......1");
// 2秒后继续执行
MyThreadUtil.sleep(2);
// 暂停当前线程
LockSupport.park();
log.info("t1......2");
LockSupport.park();
log.info("t1......3");
LockSupport.park();
log.info("t1......4");
}, "t1");
t1.start();
// 2秒后继续执行
// MyThreadUtil.sleep(2);
// 回复运行中的状态
LockSupport.unpark(t1);
log.info("unpark......1");
LockSupport.unpark(t1);
log.info("unpark......2");
}
}

3.区别

park & unpark 与 wait & notify 相比

1.wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必

2.park & unpark 是以线程为单位来 阻塞 和 唤醒 线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么 精确

3.park & unpark 可以先 unpark,而 wait & notify 不能先 notify

4.原理理解

每个线程都有自己的一个 Parker 对象,
由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)

4.1.直接解释

每个线程都有自己的一个 Parker 对象,
由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)

当调用 park想暂停线程时
如果在这之前没有调用unpark,就直接暂停当前线程.
如果在这之前调用了unpark,线程继续运行,相当于这个park无效.

当调用 unpark想让线程继续运行时
如果线程是处于暂停状态,线程被唤醒开始执行;
如果线程本来就处于运行状态,线程继续运行,并且会记住这次unpark,线程下次park时无效.
多次调用unpark时仅一次unpark有效.

完美

多线程之深入理解park与unpark的更多相关文章

  1. 温故知新-多线程-深入刨析park、unpark

    文章目录 摘要 park.unpark 看一下hotspot实现 参考 你的鼓励也是我创作的动力 Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | ...

  2. LockSupport中的park()与unpark()

    类注释原文:Basic thread blocking primitives for creating locks and other synchronization classes.意思就是Lock ...

  3. park和unpark

    1 介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport提供的两个主要方法就是park和unpark. park译为&quo ...

  4. LockSupport的park和unpark

    LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...

  5. c/c++ 多线程 mutex的理解

    多线程 mutex的理解 mutex,我的理解是每个mutex对象都是一个带锁头的门,这个门有两个状态,门开着和门关着,感觉像是废话... 当想查看门的里东西,或者把东西放进门里,或者从门里拿出东西前 ...

  6. 多线程系列之 java多线程的个人理解(二)

    前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...

  7. cpu个数、核数、线程数、Java多线程关系的理解

    cpu个数.核数.线程数.Java多线程关系的理解 2017年12月08日 15:35:37 一 cpu个数.核数.线程数的关系 cpu个数:是指物理上,也及硬件上的核心数: 核数:是逻辑上的,简单理 ...

  8. 我对java多进程多线程的浅显理解

    linux内核调度算法--CPU时间片如何分配: http://blog.csdn.net/russell_tao/article/details/7103012(转载)  ,通过该文章我们知道了进程 ...

  9. JVM 源码分析(四):深入理解 park / unpark

    前言 Parker 源码调试与分析 park/unpark 原理总结 补充:jstack 命令和 kill 命令 前言 熟悉 Java 并发包的人一定对 LockSupport 的 park/unpa ...

  10. 多线程锁--怎么理解Condition

    在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurren ...

随机推荐

  1. vue饼图

    结果图 原型 1 <template> 2 <!-- 左右柱状图 --> 3 <div ref="rankEcharts" :style=" ...

  2. SpringMVC 工作原理?

    a.客户端发送请求到 DispatcherServlet b.DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller c.Controller 调 ...

  3. monaco-editor 的 Language Services

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 这是一段平平无奇的 SQL 语法 SELECT id ...

  4. BC6-牛牛的第二个整数

    题目描述 牛牛从键盘上输入三个整数,并尝试在屏幕上显示第二个整数. 输入描述 一行输入 3 个整数,用空格隔开. 输出描述 请输出第二个整数的值. 示例 1 输入:1 2 3 输出:2 解题思路 方案 ...

  5. 5分钟了解LangChain的路由链

    上上篇文章<5分钟理透LangChain的Chain>里用到了顺序链SequentialChain,它可以将多个链按顺序串起来.本文介绍LangChain里的另外1个重要的链:路由链. 1 ...

  6. admission-controllers

    WebHook是什么  官方文档: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controller ...

  7. Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!

    Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!   想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切 ...

  8. Java for循环倒序输出

    1.实现一个for循环的倒序输出 在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现.下面,我将给出一个详细 ...

  9. yb课堂之单机和分布式应用的登陆校验解决方案 《七》

    单机tomcat应用登陆校验 session保存在浏览器和应用服务器会话之间 用户登陆成功,服务端会保存一个session,当然客户端有一个sessionId 客户端会把sessionId保存在coo ...

  10. Luogu P5745 区间最大和

    原题链接:Luogu P5745 区间最大和 初看这道题,