当前位置: 首页 > article >正文

保护性暂停原理

什么是保护性暂停?

保护性暂停(Guarded Suspension)是一种常见的线程同步设计模式,常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式,一个线程在执行过程中会检查某个条件是否满足,如果不满足,就进入等待状态,直到另一个线程通知条件已满足

在这里插入图片描述
无非就是有点类似一个空盘子,一个消费者和生产者场景有点类似。有就唤醒消费者消费,没有消费者就等待。

1、正常示例:


public class test2 {
    public static void main(String[] args) {
        GuardeObject guardeObject = new GuardeObject();
        new Thread(() -> {
            Object o = guardeObject.get();
        }).start();

        new Thread(() -> {
            guardeObject.comolete(Arrays.asList(1,2,3));
        }).start();

    }
}
class GuardeObject{
    private Object response;
    // 获取结果
    public Object get() {
        synchronized (this) {
            while (response == null) {
                try {
                    System.out.println("response == null");
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("输出结果");
            return response;
        }
    }

    // 产生结果
    public void comolete(Object response) {
        synchronized (this) {
            this.response = response;
            try {
                System.out.println("产生结果");
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.notifyAll();
        }
    }
}

2、保护性暂停超时返回示例

   // 获取结果
    public Object get(long timeout) {
        synchronized (this) {
            long begin = System.currentTimeMillis();
            long passTime = 0;
            while (response == null) {
                long waitTime = timeout - passTime;
                if (waitTime <= 0) break;
                try {
                    System.out.println("response == null");
                    this.wait(waitTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            passTime = System.currentTimeMillis() - begin;
            System.out.println("输出结果");
            return response;
        }
    }

3、join源码:

在这里插入图片描述

4、总结

保护性暂停的超时等待应用于 join()方法中,可用于超时返回结果。保护性暂停的核心:在于等待线程在某个条件不满足时进入等待状态,并通过其他线程的通知机制在条件满足时继续执行


http://www.kler.cn/a/487619.html

相关文章:

  • MT6706BL 同步整流 规格书
  • Flink源码解析之:Flink on k8s 客户端提交任务源码分析
  • 计算机网络 笔记 物理层
  • DeepSeek-V3与GPT-4o的对比详解
  • 每日一题-两个链表的第一个公共结点
  • n 维数组(张量)关于轴 axis 的理解
  • 刷式直流电机驱动芯片,适用于打印机、电器、工业设备以及其他小型机器中——GC8870
  • 解决Vscode中使用netdb.h的getaddrinfo和addrinfo会报错的方法
  • 【HTML+CSS+JS+VUE】web前端教程-9-列表标签之有序列表
  • Seed-TTS: A Family of High-Quality Versatile Speech Generation Models
  • ChatGPT网络错误如何解决
  • Leetcode 931. 下降路径最小和 动态规划
  • Windows安装ES单机版设置密码
  • golang 的 panic
  • Vue.js Ajax(vue-resource)
  • XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
  • 【算法】一阶低通滤波
  • 单向循环链表的约瑟夫环问题
  • Vue 3 和 Electron 来构建一个桌面端应用
  • STM32 : 奈奎斯特-香农采样定理
  • JavaScript语言的学习路线
  • ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
  • c#集成itext7导出pdf,包含表格
  • 基于SpringBoot的中国陕西民俗网的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 阅读笔记——《A survey of protocol fuzzing》
  • RabbitMQ解决消息积压的方法