漫谈并发编程(六):java中一些经常使用的并发构件的介绍[通俗易懂]

漫谈并发编程(六):java中一些经常使用的并发构件的介绍

大家好,又见面了,我是全栈君。

CountDownLatch

     它被用来同步一个或多个任务,强制它们等待其他任务运行的一组操作完毕。
     你能够向CountDownLatch对象设置一个初始计数值,不论什么在这个对象上调用await()的方法都将堵塞。直至这个计数值到达0。其他任务在结束其工作时。能够在该对象上调用countDown()来减小这个计数值。

CountDownLatch被设计为仅仅触发一次,计数值不能被重置。假设你须要能够重置值的版本号。则能够使用CylicBarrier。

     调用countDown()的任务在产生这个调用时并没有被堵塞。仅仅有对await()的调用会被堵塞。直至计数值到达0。
     CountDownLatch的典型使用方法是当前程序有n个互相独立的可解决任务。并创建值为n的CountDownLatch。当每一个任务完毕时,都会在这个锁存器上调用countDown()。

等待问题被解决的任务在这个锁存器上调用await()。将它们自己拦住,直到锁存器计数结束。


总结
     CountDownLatch模拟了一种
多任务堵塞等待-
多可解决任务达成某一条件的这一场景。假设仅仅是多任务堵塞等待某一任务。那么直接使用wait和signalAll就能够简单实现了。假设是等待多任务完毕,使用wait和signalAll就必需要结合一个计数值及锁来共同实现这样的情景。java帮我们抽象出了这样的应用场景,解决方式名为CountDownLatch。

CyclicBarrier

     CyclicBarrier适用于这种情况:你希望创建一组任务,它们并行的运行工作,然后在进行下一个步骤之前等待,直至全部任务都完毕(看起来有些像join())。它使得全部的并行任务都将在栅栏处队列,因此能够一致地向前移动。

总结
     CountDownLatch像有裁判员的田径比赛,要等全部裁判员都到位之后,才干开跑。CyclicBarrier像没有裁判员的比赛。仅仅须要比赛队员各就各位之后就能够直接开跑。试想一下用wait和signal怎样实现这样的场景,利用一个锁来控制一个计数值的訪问,假设这个计数值大于1,就wait到某个对象上(能够是这个计数值对象),然后-1,假设计数值为1,则对该对象signalAll。

java帮我们抽象出这样的场景,名曰CyclicBarrier。


DelayQueue

     这是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,当中的对象仅仅能在其到期时才干从队列中取出。这样的队列是有序的,即队头对象的延迟到期的时间最长。

假设没有不论什么延迟到期,那么就不会有不论什么头元素,而且poll()将返回null(正由于这样,你不能将null放置到这样的队列中)。

     Delayed接口有一个方法名为getDelay(),它能够用来告知延迟到期有多长时间,或者延迟在多长时间之前已经到期,这种方法将限制我们去使用TimeUnit类。     

总结
     对于普通队列来说就是一个先进先出的队列。对于DelayQueue队列的理解能够觉得它存在两个队列。一个优先级队列存放还未到期的任务(从队头到队尾的任务。依据到期时间由近到远排序)。然后依次将到期的任务放入一个有序队列。这个有序队列就是我们真正take时取的队列。

该构件如其名,代表放入该队列的对象自己能够控制自己被取出的时间。

     在使用场景上,DelayQueue适用于限制在多少时间之后才运行的任务。

这里限制它的是时间。而不是其它线程。


PriorityBlockingQueue

     与普通BlockingQueue差别仅在于不以进队列时间评出队列时间,而以优先级高低说了算。一个以时间论英雄,一个以优先级论英雄。


SynchronousQueue

     这是一种没有内部容量的堵塞队列。因此每一个put()都必须等待一个take()。反之亦然。

这就好像是你把一个对象交给某人-没有不论什么桌子能够放置这个对象,因此仅仅有在这个人伸出手,准备好接收这个对象时,你才干工作。


ScheduledExecutor

     ScheduledExecutor提供给你一种能够定期启动线程的方式。你能够使用schedule()(运行一次任务)或者ScheduleAtFixedRate()(每隔规则的时间反复运行任务),你能够将Runnable对象设置为在将来的某个时刻运行。

功能上类似于定时器。在web系统中,使用很频繁。

Semaphore

     正常的锁(来自concurrent.locks或内建的synchronized锁),在不论什么时刻都仅仅同意一个任务訪问一项资源,而计数信号量同意n个任务同一时候訪问这个资源。
     实际上,信号量使用较少:1. 资源訪问大多仅仅存在1到2的差别,不存在2到多的差别,线程安全的对象多个訪问时没有问题,线程不安全的对象两个线程訪问就有问题。 2. 假设当前使用场景是仅仅有n个对象提供服务,能够用信号量实现,实际上用堵塞队列可能是更好的做法。

Exchanger

     Exchanger是在两个任务之间交换对象的栅栏。当这些任务进入栅栏时,它们各自拥有一个对象,当它们离开时,它们都拥有之前由对象持有的对象。

Exchanger的典型应用场景是:一个任务在创建对象。这些对象的生产代价非常高昂。而还有一个任务在消费这些对象。

通过这样的方式,能够有很多其它的对象在创建的同一时候被消费。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116315.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了[通俗易懂]

    一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了[通俗易懂]大家好,我是帅地。对于约瑟夫环问题估计大家都听说过,除非你刚刚读大一,因为在大一大部分学校的课本都会降到这个算法题。为了以防万一你没听过,我还是给下问题的描述问题描述:编号为1-N的N个士兵围坐在一起形成一个圆圈,从编号为1的士兵开始依次报数(1,2,3…这样依次报),数到m的士兵会被杀死出列,之后的士兵再从1开始报数。直到最后剩下一士兵,求这个士兵的编号。记得有一次,貌似是阿里的面试,面试官给了我一到原汁原味的约瑟夫好,好家伙,看我不把你秀一把。不过,作为一个有着几十场面

    2022年6月4日
    35
  • pycharm更换账号/pycharm更换jetBrains许可证

    pycharm更换账号/pycharm更换jetBrains许可证pycharm更换jetBrains账号/pycharm更换许可证

    2022年8月27日
    3
  • 算法的时间与空间复杂度(一看就懂)

    算法的时间与空间复杂度(一看就懂)算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算…

    2022年5月14日
    28
  • SNMP协议测试_nmap测试udp端口

    SNMP协议测试_nmap测试udp端口SNMP测试上文介绍了net_snmp的移植,移植完成之后需要测试,现在就介绍一下如何进行snmp的功能测试,还是在基于高通9607芯片开发的ME3630模块上进行测试,这里需要用到一个工具就是mibbrowser可以在其官网上下载http://ireasoning.com/mibbrowser.shtml是付费软件,我们可以下载个人版,但是个人版好像不支持v3版本的snmp,企业版是全部支持的但是只有30天的使用期限,这个项目里我只是做功能测试,30天足够了,就下载了企业版,对各个版本的SNMP都

    2022年10月16日
    1
  • 纯css下拉菜单详解

    纯css下拉菜单详解一级菜单二级菜单二级菜单二级菜单一级菜单二级菜单二级菜单二级菜单下拉菜单由于实用,所以受到人们的欢迎。下拉菜单通常是由javascript来实现的,也应该由javascript来实现,因为这属于行为层范围。然而大家知道,使用CSS的

    2025年6月10日
    0
  • java StringTokenizer_string s=new string[10]

    java StringTokenizer_string s=new string[10]StringTokenizer类:解析字符串单词和split方法不同的是,StringTokenizer对象不使用正则表达式做分隔标记有时候要分析字符串并将字符串分解成可独立使用的单词,这些单词称为语言符号。对于字符串“Iamstudent”,如果把空格作为该字符串的标记,那么该字符串有三个单词(语言符号)。对于字符串“I,am,student”,如果把逗号作为该字符串的标…

    2022年8月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号