CountDownLatch、CyclicBarrier及Semaphore的用法示例
一、参考blog
https://www.cnblogs.com/dolphin0520/p/3920397.html
二、CountDownLatch
个人把它类比于一个持有计数的闸门,每到达这个闸门一个线程,计数减1,当计数为0时再执行闸门后续的动作。同时闸门失效了(只能用一次)。
public static void main(String[] args) {
        Executor fix = Executors.newFixedThreadPool();
        CountDownLatch latch = new CountDownLatch();
        Runnable runner = () -> {
            System.out.println("[" + Thread.currentThread().getName() + "]" + " started");
            System.out.println("[" + Thread.currentThread().getName() + "]" + " finished");
            latch.countDown();
        };
        fix.execute(runner);
        fix.execute(runner);
        try {
            System.out.println("[" + Thread.currentThread().getName() + "]" + " waiting on latch...");
            latch.await();
            System.out.println("[" + Thread.currentThread().getName() + "]" + " ok, i can do my work");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
三、CyclicBarrier
用法差不多,特点:可以重复使用。
    public static void main(String[] args) {
        Executor fix = Executors.newFixedThreadPool();
        CyclicBarrier barrier = new CyclicBarrier();
        Runnable runner = () -> {
            try {
                Thread.sleep(new Random().nextInt());
                System.out.println("[" + Thread.currentThread().getName() + "]" + " wait on barri " + new Date());
                barrier.await();
                System.out.println("[" + Thread.currentThread().getName() + "]" + " condition ok, do my work " + System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        };
        fix.execute(runner);
        fix.execute(runner);
    }
四、Semaphore
向量,有点像锁。
import java.util.Date;
import java.util.Random;
import java.util.concurrent.*; public class Test {
//
public static void main(String[] args) {
Executor fix = Executors.newFixedThreadPool();
Semaphore semaphore = new Semaphore(); Runnable runner = () -> {
try {
semaphore.acquire();
System.out.println("[" + Thread.currentThread().getName() + "]" + " get a semaphore " + new Date());
Thread.sleep();
System.out.println("[" + Thread.currentThread().getName() + "]" + " release a semaphore " + new Date());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}; for (int i = ; i < ; i++) {
fix.execute(runner);
} }
CountDownLatch、CyclicBarrier及Semaphore的用法示例的更多相关文章
- CountDownLatch CyclicBarrier和 Semaphore
		CountDownLatch CyclicBarrier和 Semaphore 原理 基于AQS实现. 让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果 ... 
- CountDownLatch, CyclicBarrier and Semaphore
		Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ... 
- CountDownLatch、CyclicBarrier和Semaphore 使用示例及原理
		备注:博客园的markDown格式支持的特别不友好.也欢迎查看我的csdn的此篇文章链接:CountDownLatch.CyclicBarrier和Semaphore 使用示例及原理 CountDow ... 
- 温故知新-多线程-forkjoin、CountDownLatch、CyclicBarrier、Semaphore用法
		Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0 文章目录 摘要 forkjoin C ... 
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
		CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ... 
- Java并发之CountDownLatch、CyclicBarrier和Semaphore
		CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ... 
- Java中的并发工具类(CountDownLatch、CyclicBarrier、Semaphore、Exchanger)
		在JDK的并发包里提供了很多有意思的并发工具类.CountDownLatch.CyclicBarrier和Semaphore 工具类提供了一种并发流程控制的手段,Exchanger 工具类则提供了在线 ... 
- Java中的并发工具类:CountDownLatch、CyclicBarrier和Semaphore
		在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 一. ... 
- CountDownLatch/CyclicBarrier/Semaphore 使用过吗?
		CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch 背景; countDownLatch ... 
随机推荐
- STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义
			DMA_FLAG_TCIF0_4就是指DMA的通道0和通道4,DMA_FLAG_TCIF1_5就是指DMA的通道1和通道5,DMA_FLAG_TCIF2_6就是指DMA的通道2和通道6,DMA_FLA ... 
- js手机端和pc端加载不同的样式
			function loadCSS() { if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android| ... 
- BZOJ3626 [LNOI2014]LCA 树链剖分 线段树
			欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3626 题意概括 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节 ... 
- POJ2065 SETI 高斯消元
			欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ2065 题意概括 多组数据,首先输入一个T表示数据组数,然后,每次输入一个质数,表示模数,然后,给出一 ... 
- 025 如何利用github绑定自己的域名
			这个以前是看同时的文档的,最近重新配置了一次,还是感觉同时的这个文档挺好的,就不再重新书写了,只复制一个连接. https://blog.csdn.net/iliujie/article/detail ... 
- python下sqlite增删查改方法(转)
			sqlite读写 #coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqli ... 
- Linux学习之分区自动挂载与fstab文件修复(九)
			linux分区自动挂载与fstab文件修复 在前面我们实现新添加硬盘,进行分区与格式化,然后手动挂载,这样做,在重启后,需要重新挂载才能使用. https://www.cnblogs.com/-wen ... 
- es6的解构赋值用途
			(1)交换变量的值 let x = 1; let y = 2; [x, y] = [y, x]; 上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰. (2)从函数返回多个值 函数 ... 
- boostrap常用的类
			1.col-md-push-3 :向右移动3 2.col-md-pull -9 : 向左移动9 3.clearfix: 清除元素浮动问题 4. col-md-offset-3: 向右偏移 5.pul ... 
- 我的 Sublime Text 2 笔记
			作为aptana死忠粉的我,最近由于工作需要最近开始使用sublime,初次使用,就被其秒开的启动速度,简洁的界面设计,无干扰的信息提示所这幅. 俗话说,工欲善其事必先利其器,作为码农,在开始编码之前 ... 
