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. 判断URL是否编码,编码后的sign对签名和验签都有影响,导致验签不通过

    判断URL是否编码,编码后的sign对签名和验签都有影响,导致验签不通过如果含有 + %符号无法判断, 否则判断不准或报错 Exception in thread "main" j ...

  2. 微信支付普通商户与AppID账号关联管理-授权

    微信支付普通商户与AppID账号关联管理 二.名词解释 名词 释义 微信支付普通商户 公司企业.政府机关.事业单位.社会组织.个体工商户.个人卖家.小微商户.(微信支付商户接入指引) AppID 已通 ...

  3. navicat 连接oracle 失败

    问题: 1.使用Navicat连接Oracle数据库时,报错ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA ...

  4. docker制作springboot镜像

    以下步骤在具有Docker环境的Linux机器上操作. 把springboot-1.0.0.jar放到/usr/local/springboot目录下,并在该目录下创建Dockerfile文件,内容为 ...

  5. IS-IS总结

    IS-IS     管理距离115     ISIS是链路状态协议     封装在数据链路层,所以没有协议号     使用SPF算法计算最短路径     没有骨干区的概念     使用IIH(ISIS ...

  6. 配置 Gerrit 迁移

    https://gerrit.googlesource.com/plugins/replication/+doc/master/src/main/resources/Documentation/con ...

  7. VSCode 中 Markdown Preview Enhanced 插件利用 Chrome (Puppeteer) 导出 PDF 文件使用说明与问题解决

    准备 预先安装好 Chrome 浏览器. 使用方法 右键选择 Chrome (Puppeteer). 设置 Puppeteer 通过 front-matter 即在 markdown 文档开头加上 y ...

  8. HCIA基本命令

    ACLDHCPNATSTP-RSTP-MSTPVLANVLAN间路由VRRP链路聚合路由

  9. mtr和traceroute的区别,以及为什么traceroute不显示路径mtr却可以显示路径

    最近工作主要都是网络策略的开通和网络测试,在测试的过程当中发现当网络不通时,用traceroute来看路由路径的时候总是无法显示出来,于是就换了个工具-mtr,发现mtr可以正常显示出路由路径,帮助我 ...

  10. Rougamo、Fody 实现静态Aop

    最近在看项目,看到别人使用Rougamo框架,好奇花了点时间仔细研究了,在这里记录一下. 0. 静态编织 Aop 首先,我们先了解什么是Aop? Aop 是指面向切面编程 (Aspect Orient ...