JAVA语言之浅谈CountDownLatch、CyclicBarrier、Samephore三大机制
从安 2019-06-05 来源 : 阅读 1491 评论 0

摘要:本篇文章主要讲述JAVA语言之浅谈CountDownLatch、CyclicBarrier、Samephore三大机制,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章主要讲述JAVA语言之浅谈CountDownLatch、CyclicBarrier、Samephore三大机制,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

JAVA语言之浅谈CountDownLatch、CyclicBarrier、Samephore三大机制

CountDownLatch、CyclieBarrier与SamePhore都可用来控制线程的执行,那么他们之间有什么区别呢

CountDownLatch

CountDowenlatch可以看成一个线程等待多个线程,当多个线程执行完毕后最后线程才会执行

话不多说。直接上代码

/**
 * 一个线程等待多个线程,当多个线程都执行后
 * 等待的线程才会执行
 * @author chen
 *
 */public class CountDownLatchT {
    
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        for(int i=0;i{
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName());
            },"线程"+i).start();
        }
        
        countDownLatch.await();
        System.out.println("main");
    }
}

可以看到,刚开始给要等待的线程数设置个初始值,这里为5,意思是要等待5个线程,在线程里,要显式的时候countDownLatch的countDown方法表明当前线程已经到了,将要等待的线程数减1,然后继续执行自己的代码。要等待的那个线程这里是main线程要使用countDownLatch的await方法进行等待。当所有线程都到达后并且都执行countdown方法后等待线程才会被唤醒执行。所以这段代码的结果是前面的5个线程都执行完后主线程才会执行。CyclicBarrier

如果说countdownlatch是执行减操作,每到一个线程就减1,直到减为0,被阻塞的线程才执行的话。那么CyclicBarrier就可以看作是加操作了。先上代码。 

/**
 *     所有线程通过cyclicBarrier的await方法阻塞,直到最后一个线程到达后
 *     才唤醒所有线程,这时这些线程才能继续往下执行
 * @author chen
 *
 */public class CyclicBarrierT {
    
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        
        for(int i=0; i{
                System.out.println(Thread.currentThread().getName()+"start");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"end");
            },"线程"+i).start();
        }
    }
}

CyclicBarrier的工作原理是多个线程等一个线程,当一个线程到达的时候就使用await方法进入屏障,直到最后一个线程到达屏障的时候屏障才会解除,所有到屏障的线程才会被唤醒继续往下执行。SamePhore

SamePhore是信号量的意思,它的使用场景是多个线程使用有限个资源的情况。可以类比停车位,当汽车数大于停车位的时候一次只能有若干辆汽车进去停车场,当汽车从停车场开出来的时候其他汽车才能进入停车场。上代码 

/**
 * Semaphore限定一次只能有几个线程执行
 * 线程进入前使用acquire获取执行权
 * 结束后使用release释放执行权
 * @author chen
 *
 */public class SemaPhoreT {
    
    public static void main(String[] args) {
        
        Semaphore semaphore = new Semaphore(2);
        
        for(int i=0;i{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"启动了");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    semaphore.release();
                }
            },"线程"+i).start();
        }
        
    }
}

上面代码信号量定义为2,线程数为10,因此我们执行的时候可以看到每次只有2个线程在运行。


本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @从安 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程