多线程之深入理解park与unpark

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有效.

完美

posted @   李东平|一线码农  阅读(441)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2018-02-01 03_java基础(五)之项目结构搭建
2018-02-01 03_java基础(四)之方法的创建与调用
2018-02-01 03_java基础(三)之第一个程序与开发工具的安装
2018-02-01 03_java基础(二)之jdk的安装与环境变量配置
2018-02-01 03_java基础(一)之计算机应用知识普及
2018-02-01 java工程师基础笔试题(一)
点击右上角即可分享
微信分享提示