iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中CountDownLatch异步转同步工具类的示例分析
  • 469
分享到

Java中CountDownLatch异步转同步工具类的示例分析

2023-06-20 12:06:28 469人浏览 独家记忆
摘要

小编给大家分享一下Java中CountDownLatch异步转同步工具类的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用场景由于公司业务需求,需要对接Socket、MQTT等消息队列。众所周知 socket 是

小编给大家分享一下Java中CountDownLatch异步转同步工具类的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

使用场景

由于公司业务需求,需要对接SocketMQTT等消息队列
众所周知 socket 是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条线。无法像Http请求有回复。
下发指令给硬件时,需要校验此次数据下发是否成功。
用户体验而言,点击按钮就要知道此次的下发成功或失败。

Java中CountDownLatch异步转同步工具类的示例分析

如上图模型,

第一种方案使用Tread.sleep
优点:占用资源小,放弃当前cpu资源
缺点: 回复速度快,休眠时间过长,仍然需要等待休眠结束才能返回,响应速度是固定的,无法及时响应第二种方案使用CountDownLatch

package com.lzy.demo.delay;import java.util.Map;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CountDownLatch;import java.util.concurrent.DelayQueue;import java.util.concurrent.Delayed;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class CountDownLatchPool {    //countDonw池    private final static Map<Integer, CountDownLatch> countDownLatchMap = new ConcurrentHashMap<>();    //延迟队列    private final static DelayQueue<MessageDelayQueueUtil> delayQueue = new DelayQueue<>();    private volatile static boolean flag =false;    //单线程池    private final static ExecutorService t = new ThreadPoolExecutor(1, 1,        0L, TimeUnit.MILLISECONDS,        new ArrayBlockingQueue<>(1));    public static void addCountDownLatch(Integer messageId) {        CountDownLatch countDownLatch = countDownLatchMap.putIfAbsent(messageId,new CountDownLatch(1) );        if(countDownLatch == null){            countDownLatch = countDownLatchMap.get(messageId);        }        try {            aDDDelayQueue(messageId);            countDownLatch.await(3L, TimeUnit.SECONDS);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("阻塞等待结束~~~~~~");    }    public static void removeCountDownLatch(Integer messageId){        CountDownLatch countDownLatch = countDownLatchMap.get(messageId);        if(countDownLatch == null)            return;        countDownLatch.countDown();        countDownLatchMap.remove(messageId);        System.out.println("清除Map数据"+countDownLatchMap);    }    private static void addDelayQueue(Integer messageId){        delayQueue.add(new MessageDelayQueueUtil(messageId));        clearMessageId();    }    private static void clearMessageId(){        synchronized (CountDownLatchPool.class){            if(flag){                return;            }            flag = true;        }        t.execute(()->{            while (delayQueue.size() > 0){                System.out.println("进入线程并开始执行");                try {                    MessageDelayQueueUtil take = delayQueue.take();                    Integer messageId1 = take.getMessageId();                    removeCountDownLatch(messageId1);                    System.out.println("清除队列数据"+messageId1);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            flag = false;            System.out.println("结束end----");        });    }    public static void main(String[] args) throws InterruptedException {                //提前创建线程,清空countdown        new Thread(()->{            try {                Thread.sleep(500L);                removeCountDownLatch(1);            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        //开始阻塞        addCountDownLatch(1);    //通过调整上面的sleep我们发现阻塞市场取决于countDownLatch.countDown()执行时间    System.out.println("阻塞结束----");    }}class MessageDelayQueueUtil implements Delayed {    private Integer messageId;    private long avaibleTime;    public Integer getMessageId() {        return messageId;    }    public void setMessageId(Integer messageId) {        this.messageId = messageId;    }    public long getAvaibleTime() {        return avaibleTime;    }    public void setAvaibleTime(long avaibleTime) {        this.avaibleTime = avaibleTime;    }    public MessageDelayQueueUtil(Integer messageId){        this.messageId = messageId;        //avaibleTime = 当前时间+ delayTime        //重试3次,每次3秒+1秒的延迟        this.avaibleTime=3000*3+1000 + System.currentTimeMillis();    }    @Override    public long getDelay(TimeUnit unit) {        long diffTime= avaibleTime- System.currentTimeMillis();        return unit.convert(diffTime,TimeUnit.MILLISECONDS);    }    @Override    public int compareTo(Delayed o) {        //compareTo用在DelayedUser的排序        return (int)(this.avaibleTime - ((MessageDelayQueueUtil) o).getAvaibleTime());    }}

由于socket并不确定每次都会有数据返回,所以map的数据会越来越大,最终导致内存溢出
需定时清除map内的无效数据。
可以使用DelayedQuene延迟队列来处理,相当于给对象添加一个过期时间

使用方法 addCountDownLatch 等待消息,异步回调消息清空removeCountDownLatch

看完了这篇文章,相信你对“Java中CountDownLatch异步转同步工具类的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: Java中CountDownLatch异步转同步工具类的示例分析

本文链接: https://www.lsjlt.com/news/296648.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中CountDownLatch异步转同步工具类的示例分析
    小编给大家分享一下Java中CountDownLatch异步转同步工具类的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用场景由于公司业务需求,需要对接socket、MQTT等消息队列。众所周知 socket 是...
    99+
    2023-06-20
  • 详解Java中CountDownLatch异步转同步工具类
    使用场景 由于公司业务需求,需要对接socket、MQTT等消息队列。 众所周知 socket 是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条...
    99+
    2024-04-02
  • Java多线程之同步工具类CountDownLatch
    目录1 CountDownLatch主要方法2 CountDownLatch使用例子3 CountDownLatch源码分析构造函数countDown方法countDown方法的内部...
    99+
    2024-04-02
  • Java多线程同步工具类CountDownLatch详解
    目录简介核心方法CountDownLatch如何使用CountDownLatch运行流程运用场景总结简介 CountDownLatch是一个多线程同步工具类,在多线程环境中它允许多个...
    99+
    2024-04-02
  • Ajax中同步和异步的示例分析
    小编给大家分享一下Ajax中同步和异步的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过ajax向后台发送和接收数据时...
    99+
    2024-04-02
  • Java多线程同步工具类CountDownLatch怎么使用
    本篇内容主要讲解“Java多线程同步工具类CountDownLatch怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程同步工具类CountDownLatch怎么使用”吧!简介...
    99+
    2023-07-02
  • React中setState同步和异步的示例分析
    这篇文章主要介绍React中setState同步和异步的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! React起源于Facebook的内部项目。React的出现是革命性的创新,React的是一个...
    99+
    2023-06-15
  • Awaitility同步异步工具实战示例详解
    目录引言1. awaitility入门1.1 静态导入1.2 简单例子2. awaitility在RocketMQ中的实战3. 总结引言 在编写测试用例的时候遇到有异步或者队列处理的...
    99+
    2024-04-02
  • ajax同步和异步XMLHTTP的示例分析
    这篇文章给大家分享的是有关ajax同步和异步XMLHTTP的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 在网页脚本编程中,绝大多数情况应...
    99+
    2024-04-02
  • Ajax请求中异步与同步的示例分析
    这篇文章主要为大家展示了“Ajax请求中异步与同步的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ajax请求中异步与同步的示例分析”这篇文章吧。 ...
    99+
    2024-04-02
  • React中setState同步或异步问题的示例分析
    这篇文章主要为大家展示了“React中setState同步或异步问题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React中setState同步或异步问题的示例分析”这篇文章吧。1....
    99+
    2023-06-25
  • JavaScript中异步的示例分析
    这篇文章将为大家详细讲解有关JavaScript中异步的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、异步解决方案的进化史JavaScript的异步操作一直是...
    99+
    2024-04-02
  • Java中Servlet3.0异步处理的示例分析
    这篇文章主要介绍了Java中Servlet3.0异步处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。通过本篇文章主要给大家讲解了在JAVA开发中Servlet3....
    99+
    2023-05-30
    java servlet3.0
  • Java工具类DateUtils的示例分析
    这篇文章主要介绍了Java工具类DateUtils的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下import java.text.ParseE...
    99+
    2023-05-30
    java dateutils
  • Nodejs中异步I/O的示例分析
    小编给大家分享一下Nodejs中异步I/O的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“异步”这个名词其实在Node之前就已经诞生了。但是在绝大多数高...
    99+
    2023-06-14
  • JavaScript中异步编程的示例分析
    这篇文章给大家分享的是有关JavaScript中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目的提升开发效率,编写易维护的代码引子问题请求时候为什么页面卡死??$.ajax({ &n...
    99+
    2023-06-15
  • c#中异步编程的示例分析
    这篇文章给大家分享的是有关c#中异步编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么算异步?  广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。在面向服务的系...
    99+
    2023-06-14
  • Promise中异步编程的示例分析
    这篇文章主要介绍Promise中异步编程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下所示://1.解决异步回调问题 //1.1 如何同步异步请求 //如...
    99+
    2024-04-02
  • Springboot中异步任务的示例分析
    小编给大家分享一下Springboot中异步任务的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步任务启动类@MapperScan("com....
    99+
    2023-06-17
  • JavaScript中回调函数及区分下同步和异步回调的示例分析
    小编给大家分享一下JavaScript中回调函数及区分下同步和异步回调的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作