22.保护性暂停扩展(一对一)

news2024/11/10 16:00:02

如果需要多个类之间使用GuardedObject对象,作为参数传递不是很方便,因此设计一个解耦的中间类,这样不仅能够解耦结果的等待者结果生产者,还能够支持多个任务的管理。

Futures就好比居民楼一层的信箱,每个信箱有房间的编号,左侧的t0,t2,t4就好比等待邮件的居民,右侧的t1,t3,t5就好比邮递员。

public class GuardedObjectMap {

    public static void main(String[] args) {
        //有三封信要送
        for (int i = 0; i < 3; i++) {
            new People().start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //邮递员送信
        Set<Integer> ids = EmailBox.getIds();
        for (int id: ids) {
            new Postman(id, "内容"+id).start();
        }
    }
}


/**
 * 居民
 */
class People extends Thread {
    @Override
    public void run() {
        GuardedObjectObj guardedObjectObj = EmailBox.createGuardedObjectObj();
        System.out.println("开始收信index="+guardedObjectObj.getIndex());
        Object mail = guardedObjectObj.get(5000);
        System.out.println("收到信index="+guardedObjectObj.getIndex()+",内容="+mail);
    }
}

/**
 * 邮递员
 */
class Postman extends Thread {

    private int index;
    private String mail;

    public Postman(int index, String mail) {
        this.index = index;
        this.mail = mail;
    }

    @Override
    public void run() {
        GuardedObjectObj guardedObjectObj = EmailBox.getGuardedObjectObj(index);
        System.out.println("开始送信index="+index+",内容="+mail);
        guardedObjectObj.complete(mail);
    }
}


/**
 * 信箱
 */
class EmailBox {
    //线程安全的集合
    private static Map<Integer, GuardedObjectObj> box = new ConcurrentHashMap<>();

    // 产生唯一id
    public static int id = 1;
    public static synchronized int generatedId() {
        // ++操作是线程不安全的要加锁
        return id++;
    }

    /**
     * 创建一个GuardedObjectObj对象并返回该对象,同时放入map中
     * @return
     */
    public static GuardedObjectObj createGuardedObjectObj() {
        GuardedObjectObj guardedObjectObj = new GuardedObjectObj(generatedId());
        box.put(guardedObjectObj.getIndex(), guardedObjectObj);
        return guardedObjectObj;
    }

    /**
     * 根据index获取GuardedObjectObj
     * @param index
     * @return
     */
    public static GuardedObjectObj getGuardedObjectObj(int index) {
        //因为box是静态的集合,使用完的对象一定要删除,防止堆内存溢出
        return box.remove(index);
    }

    /**
     * 获取所有GuardedObjectObj的keys
     * @return
     */
    public static Set<Integer> getIds() {
        return box.keySet();
    }

}

class GuardedObjectObj {

    //标号(区分不同的GuardedObjectObj)
    private int index;

    public GuardedObjectObj(int index) {
        this.index = index;
    }

    public int getIndex() {
        return index;
    }

    private Object response;

    /**
     * 获取结果
     * @param timeout
     * @return
     */
    public Object get(long timeout) {
        synchronized (this) {
            long start = System.currentTimeMillis();
            long usedTime = 0;
            while(response == null) {
                long waitTime = timeout - usedTime;
                if(waitTime <= 0) {
                    break;
                }
                try {
                    this.wait(waitTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                usedTime = System.currentTimeMillis() - start;
            }
            return response;
        }
    }

    /**
     * 产生结果
     */
    public void complete(Object response) {
        synchronized (this) {
            this.response = response;
            this.notifyAll();
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1544128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

清华大学突破性研究:GVGEN技术,7秒内从文字到3D高保真生成

引言&#xff1a;3D模型生成的挑战与机遇 随着计算机图形学的发展&#xff0c;3D模型的生成在各个行业中变得越来越重要&#xff0c;包括视频游戏设计、电影制作以及AR/VR技术等。在3D建模的不同方面中&#xff0c;从文本描述生成3D模型成为一个特别有趣的研究领域&#xff0c;…

哪些行业需要在线制作电子证书系统?

哪些行业需要在线制作电子证书系统&#xff1f; 1、教育机构&#xff1a;学校和培训机构需要为学生和培训者颁发证书&#xff0c;您的系统可以帮助他们快速生成和管理这些证书。 2、企业及政府部门&#xff1a;用于员工培训、资质认证等&#xff0c;提高内部管理效率。 3、专…

Learn OpenGL 29 延迟着色法

延迟着色法 我们现在一直使用的光照方式叫做正向渲染(Forward Rendering)或者正向着色法(Forward Shading)&#xff0c;它是我们渲染物体的一种非常直接的方式&#xff0c;在场景中我们根据所有光源照亮一个物体&#xff0c;之后再渲染下一个物体&#xff0c;以此类推。它非常…

2024 ccfcsp认证打卡 2023 09 01 坐标变换(其一)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt(); // 操作次数int m in.nextInt(); // 初始坐标个数int temp_x 0; // 临时存储x的累加值int temp_y 0; // 临时存储y的累…

星云小窝项目1.0——项目启动(二)

星云小窝项目1.0——项目启动&#xff08;二&#xff09; 文章目录 前言1. 从Github从下载它2. 使用编辑器打开&#xff08;以pycharm为例&#xff09;2.1. 下载所需要的模块2.2. 配置mysql数据库2.3. 配置QQ邮箱发送验证码2.4. 修改代码3. 启动总结 前言 上一篇博客大致介绍了…

用户态和内核态:操作系统权限与运行模式解析

在现代计算机操作系统中&#xff0c;用户态&#xff08;User Mode&#xff09;和内核态&#xff08;Kernel Mode&#xff09;是两种重要的运行模式&#xff0c;用于区分用户程序与操作系统核心之间的权限和特权级别。深入理解这两种模式对于理解操作系统的工作原理至关重要。 …

发布文章积分自动增加

controller ApiOperation(value "添加文章")PostMapping("/addwengzhang")public String addwengzhang(RequestBody WengDto wengDto) {if (wengDto.getContent() null || wengDto.getTitle() null) {return "参数不可为空";}User user user…

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

阿里云OSS对象存储完全开发手册(一篇学会阿里云OSS所有知识点)

一、什么是OSS存储 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;的数据持久性&#xff0c;99.995%的数据可用性。多种存储类型供选择&#…

生成可读取配置文件的独立运行jar程序

前言: 周五刚躺下,前线打来语音要个下载文件的小程序,下载路径和下载码需要根据配置获取,程序需要在服务器执行。当然配置的设计是个人设计的,不然每次更新下载码都要重新出具jar包,太麻烦。多年没写独立运行的jar包了,翻阅了相关资料,最终还是功夫不负有心人。想着这种…

计算机复试面试问答准备(未完)

目录 1、理解多态性2、怎么逆置⼀个链表3、顺序表和链表的区别4、树的存储结构5、什么是哈夫曼树&#xff1f;简述哈夫曼树的构造过程。介绍哈夫曼树的特性。6、哈夫曼编码的编码和解码过程7、图的遍历方式8、图的存储方式9、最小生成树10、迪杰斯特拉算法11、佛洛依德算法12、…

2024年3月26日 十二生肖 今日运势

小运播报&#xff1a;2024年3月26日&#xff0c;星期二&#xff0c;农历二月十七 &#xff08;甲辰年丁卯月己丑日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;鸡、鼠、猴 需要注意&#xff1a;马、狗、羊 喜神方位&#xff1a;东北方 财神方位&#xff1a;…

修改网站源码,给电子商城的商品添加图片时商品id为0的原因

修改网站源码&#xff0c;给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来&#xff0c;由于PictureControl.class.php是复制CourseControl.class.php而来&#xff0c;于是对比了这两个文件&#xff0c;在CourseControl.class.php找到了不一样的关键几条…

GEE入门及进阶教程|在 Earth Engine 中绘制图像集合

在前面的内容中&#xff0c;我们计算了增强植被指数 (EVI)&#xff0c;以说明卫星图像上的波段运算&#xff0c;代码在单个图像上被调用一次。 如果我们想以相同的方式计算整个 ImageCollection 中的每个图像的 EVI&#xff0c;该怎么办&#xff1f;在这里&#xff0c;我们使用…

Java Swing游戏开发学习17

内容来自RyiSnow视频讲解 这一节讲的是Event(Damage Pit, Healing Pool, Teleport Tile)&#xff0c;直译&#xff1a;事件&#xff08;伤害深坑(类似陷阱吧)&#xff0c;治愈池&#xff0c;传送瓦片&#xff09; 事件&#xff08;陷阱【掉进去回掉血】&#xff0c;治愈池【可…

js获取cookie

js获取cookie 前言实现讲解特别注意&#xff1a; 前言 主要是通过document.cookie来进行实现的 实现讲解 首先通过document.cookie 来获取到所有的cookie 然后通过分号进行分割成list 然后循环list,将list中的字符串通过首个等号进行分割然后和指定的cookie名进行比对然后返…

浙政钉小程序加入埋点

研究好久&#xff0c;终于知道埋点怎么写了&#xff0c;我是使用原生写的&#xff0c;请参考&#xff01; 小程序埋点只需要添加稳定性监控代码&#xff08;Emas&#xff09;和流量分析代码(A) **稳定性监控代码&#xff08;Emas&#xff09;**只需要在首页加入。**流量分析代码…

关系型数据库mysql(6)备份与恢复

一.数据备份的重要性 &#xff08;1&#xff09;在生产环境中&#xff0c;数据的安全性至关重要 &#xff08;2&#xff09;任何数据的丢失都可能产生严重的后果 &#xff08;3&#xff09;造成数据丢失的原因 程序错误人为操作失误运算错误磁盘故障灾难&#xff08;如火灾…

Selenium 自动化 —— 切换浏览器窗口

更多内容请关注我的 Selenium 自动化 专栏&#xff1a; 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作 平时我们在使用浏览器时&#xff0c;通常会打开多个窗口&#xff0c;然后再多个窗口中来回切换&#xf…