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

标签:java,同步器
0
投稿

猜你喜欢

  • 分享几个Java工作中实用的代码优化技巧

    2023-11-28 12:04:50
  • java开源好用的简繁转换类库推荐

    2022-11-09 06:31:32
  • IDEA搭建SpringBoot离线工程的方法

    2023-04-11 05:50:42
  • Android中Button实现点击换图案及颜色

    2022-06-28 00:42:10
  • Treeview动态添加用户控件传值和取值的实例代码

    2021-07-20 11:20:07
  • Android 保存WebView中的图片示例

    2021-10-05 21:57:05
  • Android图像处理之霓虹滤镜效果

    2023-08-11 14:37:41
  • Java Spring5学习之JdbcTemplate详解

    2023-11-25 20:17:23
  • 使用ObjectMapper解析json不用一直new了

    2023-11-25 05:20:10
  • Eclipse下基于Java的OpenCV开发环境配置教程

    2022-01-30 21:02:54
  • Spring bean对象实例化实现过程图解

    2023-01-02 07:32:13
  • SpringMVC @RequestMapping注解详解

    2022-08-08 06:58:14
  • Android SharedPreferences数据存储详解

    2023-08-05 13:32:47
  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    2021-11-18 12:18:05
  • .Net WInform开发笔记(三)谈谈自制控件(自定义控件)

    2021-06-11 10:25:11
  • 解决Map集合使用get方法返回null抛出空指针异常问题

    2023-11-25 00:14:00
  • c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    2023-01-10 02:04:41
  • 基于Spring AOP proxyTargetClass的行为表现总结

    2022-05-23 18:33:43
  • Java多线程之同步工具类CyclicBarrier

    2021-10-13 00:24:20
  • java实现简单的拼图游戏

    2022-01-27 08:34:32
  • asp之家 软件编程 m.aspxhome.com