java 同步器SynchronousQueue详解及实例

 更新时间:2017年05月22日 11:15:44   投稿:lqh  
这篇文章主要介绍了java 同步器SynchronousQueue详解及实例的相关资料,需要的朋友可以参考下

同步器简介

       学习以来对线程的操作有很大的改观,从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));

用了这个同步器,这种定时生产者消费者问题,代码量就很少,不需要自己再写同步的代码了。也避免了最初唤醒阻塞带来的不可预估性。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • SpringBoot整合TomCat实现本地图片服务器代码解析

    SpringBoot整合TomCat实现本地图片服务器代码解析

    这篇文章主要介绍了SpringBoot整合TomCat实现本地图片服务器代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 深入理解Java中没那么简单的单例模式

    深入理解Java中没那么简单的单例模式

    这篇文章主要给大家详细介绍了Java单例模式,关于Java中的单例模式并非看起来那么简单的,为什么要这么说呢?下面通过这篇文章来一起看看吧,有需要的朋友们可以参考借鉴。
    2017-01-01
  • Springboot获取文件内容如何将MultipartFile转File

    Springboot获取文件内容如何将MultipartFile转File

    本文给大家介绍Springboot获取文件内容,将MultipartFile转File方法,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • 支持生产阻塞的Java线程池

    支持生产阻塞的Java线程池

    在各种并发编程模型中,生产者-消费者模式大概是最常用的了。在实际工作中,对于生产消费的速度,通常需要做一下权衡
    2014-04-04
  • Java中FileWriter的用法及wirte()重载方法详解

    Java中FileWriter的用法及wirte()重载方法详解

    这篇文章主要介绍了Java中FileWriter的用法及wirte()重载方法详解,FileWriter是Java编程语言中的一个类,用于将字符写入文件,它提供了一种简单而方便的方式来创建、打开和写入文件,通过使用FileWriter,我们可以将字符数据写入文本文件,需要的朋友可以参考下
    2023-10-10
  • SpringBoot全局异常处理机制和配置拦截器方式

    SpringBoot全局异常处理机制和配置拦截器方式

    这篇文章主要介绍了SpringBoot全局异常处理机制和配置拦截器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用jib插件为Java应用构建镜像的方法

    使用jib插件为Java应用构建镜像的方法

    这篇文章主要介绍了使用jib插件为Java应用构建镜像,要是用户本地没安装docker,可以使用jib制作出带有镜像的tar文件,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • IDEA修改idea64.exe.vmoptions文件以及解决coding卡顿问题

    IDEA修改idea64.exe.vmoptions文件以及解决coding卡顿问题

    IDEA修改idea64.exe.vmoptions文件以及解决coding卡顿问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot中整合MyBatis-Plus的方法示例

    SpringBoot中整合MyBatis-Plus的方法示例

    这篇文章主要介绍了SpringBoot中整合MyBatis-Plus的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java emoji表情存储的解决方法

    java emoji表情存储的解决方法

    这篇文章主要为大家详细介绍了java emoji表情存储的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论