java 同步器SynchronousQueue详解及实例
作者:lqh 发布时间:2023-04-29 00:41:07
同步器简介
学习以来对线程的操作有很大的改观,从c/c++的mutex到java的各种锁(当然不是嫌麻烦,java读写锁的实现还是带来不少好处的,但是sokcet的设计我就不敢恭维了,tcp和udp是两个类,弄得我现在对udp也不怎么熟悉)。其中最让我感到特别刚需的设计就是同步器,除了countdownlatch,剩下的都比较刚需,cyclicbarrier我现在唯一能感觉他的好用处就是循环打印a,b,exchanger和SynchronousQueue我一直没发现什么作用,两个就适合生产者消费者问题。以上就是四大同步器,听说过2个以上的就很厉害了,有些场合太难想了。
场景思路
这次说最后两个用的场景吧,我要做的事情呢,是采集一堆数据,然后采集另外的数据综合处理,但是两个数据是和时间相关的,如果顺序执行的话,那么处理结果的可信度越低,最初的设想就是利用异步处理,两个数据采集同时进行,然后一起处理,futuretask,就作为首选,我的采集信息还是周期性的任务,必需要用定时的线程池了,但是这种线程池(别说timer,这个类更建议用线程池替换)并没有为异步处理做返回值,我也没办法直接获取处理的数据了,无奈的情况下只能用线程来做了,同时也必须要用同步器来同步了,用手动阻塞线程然后唤醒这个行为实在是太不可取了,你全唤醒了,可能造成不该运行的代码开始运行,唤醒单个,还得看cpu的调度,于是想到了exchanger和SynchronousQueue,我最终选取了SynchronousQueue。
SynchronousQueue
其实就是特殊的阻塞队列,特殊就特殊在他最多放一个元素,而且这个元素不在特定的时间消费掉就没了,而且永远长度都是0,具体看api就发现能用的方法没几个,3个是放入,2个是取走。
demo
生产者,消息最多存放1分钟
public void run() {
try {
queue.offer(i++,1,TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("add");
}
消费者
System.out.println(queue.poll(1,TimeUnit.SECONDS));
用了这个同步器,这种定时生产者消费者问题,代码量就很少,不需要自己再写同步的代码了。也避免了最初唤醒阻塞带来的不可预估性。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:https://my.oschina.net/xpbob/blog/625314


猜你喜欢
- 有时,通过Runtime.getRuntime().exec()执行命令的有效负载有时会失败。使用Web Shell,反序列化利用或通过其他
- 我贴c#的代码: namespace IWebs.Webs{ using System; using System.Web.Services
- 前言最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨
- 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论。但是我觉得都是不求甚解,有一些还是在误导别人。下面我来说下我对这三者的理解,如有错
- LinkedList<T>是一个双向链表,其元素会指向它前面和后面的元素。这样,通过移动到下一个元素可以正向遍历链表,通过移动到
- 最近有一个项目要用到年份周期,用于数据统计图表展示使用,当中用到年份周期,以及年份周期所在的日期范围。当初设想通过已知数据来换算年份周期,经
- 前提:windows上安装jdk1.启动jar脚本@echo offSTART "app" javaw -jar app
- 项目初始流程:首先说一下pom.xml文件的依赖: <dependencies><!-- junit 测试 -->
- 1.application.yml中添加两个datasourceserver: port: 8080spring: application:
- 本文实例讲述了Java抛出异常与自定义异常类。分享给大家供大家参考,具体如下:异常处理常用方法:常用的异常处理方法有:一、try()catc
- 1. 使用蓝牙的响应权限<uses-permission android:name="android.permission.
- 想要php版的朋友可以到这里下载测试 https://www.jb51.net/codes/83179.htmlimport java.io
- 前言:现在的手机品牌和型号越来越多,导致我们平时写布局的时候会在个不同的移动设备上显示的效果不同,比如我们的设计稿一个View的大小是300
- 一、前言让我们先理一下springfox与swagger的关系。swagger是一个流行的API开发框架,这个框架以“开放API声明”(Op
- FeignClient脱离eureka自定义URL需求Spring Cloud环境中的FeignClient有时候需要调用特定主机的接口,但
- 本文实例讲述了C#实现判断当前操作用户管理角色的方法。分享给大家供大家参考。具体实现方法如下:/// <summary>///
- 简单工厂简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。定义了一个创建对象的类,由
- Glide 加载图片使用到的两个记录Glide 加载图片保存至本地指定路径/** * Glide 加载图片保存到
- 1.背景 SpringBoot项目中,之前都是在controller方法的第一行手动打印 log,return之前再
- SpringBoot starter用了springboot 那么久了居然都还没自定义过starter,想想都觉得羞愧,所以今天来玩一下。S