2019独角兽企业重金招聘Python工程师标准>>>

  • CountDownLatch

CountDownLatch允许一个或多个线程等待其他线程完成操作。

CountDownLatch的构造函数接受一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。

当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N编程零。此外还有一个带指定时间的await方法,这个方法等待指定时间后,就不会再阻塞当前线程。

package test;public class ThreadJoinTest {public static void main(String[] args) throws InterruptedException {Thread parser1 = new Thread(new Runnable(){public void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("parser1 finish");}});Thread parser2 = new Thread(new Runnable(){public void run() {System.out.println("parser2 finish");}});parser1.start();parser2.start();parser1.join();parser2.join();System.out.println("all finished");}
}
---------
parser2 finish
parser1 finish
all finishedpackage test;import java.util.concurrent.CountDownLatch;public class CountDownLatchTest {static CountDownLatch c = new CountDownLatch(2);public static void main(String[] args) throws InterruptedException {new Thread(new Runnable(){public void run() {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("parser1 finish");c.countDown();}}).start();new Thread(new Runnable(){public void run() {System.out.println("parser2 finish");c.countDown();}}).start();c.await();System.out.println("all finished");}
}
---------
parser2 finish
parser1 finish
all finished
  • CyclicBarrier
    CyclicBarrier让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续运行。
    CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier已经到达了屏障,然后当前线程被阻塞。
    CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties , Runnable barrierAction),用于在线程到达屏障是,优先执行barrierAction,方便处理更复杂的业务。

    package test;import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;public class CyclicBarrierTest {static CyclicBarrier c = new CyclicBarrier(2);public static void main(String args[]) throws InterruptedException, BrokenBarrierException{new Thread(new Runnable(){public void run() {System.out.println("begin");try {Thread.sleep(1000);c.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("end");}}).start();System.out.println("current thread waiting..");c.await();System.out.println("all arrived");}
    }-------
    current thread waiting..
    begin
    end
    all arrived
    
    package test;import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;public class CyclicBarrierTest2 {static CyclicBarrier c = new CyclicBarrier(2,new A());public static void main(String args[]) throws InterruptedException, BrokenBarrierException{new Thread(new Runnable(){public void run() {System.out.println("begin");try {Thread.sleep(1000);c.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("end");}}).start();System.out.println("current thread waiting..");c.await();System.out.println("all arrived");}static class A implements Runnable{public void run() {System.out.println("Thread A Running..");}}
    }
    ----------
    current thread waiting..
    begin
    Thread A Running..
    end
    all arrived
    
  • CyclicBarrier和CountDownLatch的区别
     CountDownLatch的计数只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置,所以CyclicBarrier能处理更复杂的业务场景。
     CyclicBarrier还提供其他的方法,如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量,isBroken()方法用来了解阻塞的线程是否被中断。
  • Semaphore
    Semaphore(信号量)是用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理的使用公共资源。
    Semaphore可以用于做流量控制,特别是公共资源有限的应用场景,比如数据库连接。

    package test;import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;public class SemaphoreTest {private static final int THREAD_COUNT = 10;private static ExecutorService threadPool =  Executors.newFixedThreadPool(THREAD_COUNT);private static Semaphore s = new Semaphore(5);public static void main(String[] args) throws InterruptedException {while(true){threadPool.execute(new Runnable(){public void run() {try {s.acquire();System.out.println(Thread.currentThread().getName()+": save data...");Thread.sleep(5000);s.release();} catch (InterruptedException e) {e.printStackTrace();}}});System.out.println("availablePermits: "+s.availablePermits());Thread.sleep(500);}//threadPool.shutdown();}
    }
    ----------------------------
    availablePermits: 5
    pool-1-thread-1: save data...
    availablePermits: 4
    pool-1-thread-2: save data...
    availablePermits: 3
    pool-1-thread-3: save data...
    availablePermits: 2
    pool-1-thread-4: save data...
    availablePermits: 1
    pool-1-thread-5: save data...
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    pool-1-thread-6: save data...
    availablePermits: 0
    pool-1-thread-7: save data...
    availablePermits: 0
    pool-1-thread-8: save data...
    availablePermits: 0
    pool-1-thread-9: save data...
    availablePermits: 0
    pool-1-thread-10: save data...
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    pool-1-thread-1: save data...
    availablePermits: 0
    pool-1-thread-7: save data...
    availablePermits: 0
    pool-1-thread-2: save data...
    availablePermits: 0
    pool-1-thread-9: save data...
    availablePermits: 0
    pool-1-thread-3: save data...
    availablePermits: 0
    availablePermits: 0
    availablePermits: 0
    

    在代码中,虽然有10个线程在执行,但是只允许5个并发执行。

转载于:https://my.oschina.net/langgege/blog/3028952

JAVA中的并发工具 -- CountDownLatch、CyclicBarrier、Semaphore相关推荐

  1. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  2. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  3. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch

    上一篇:Java中的阻塞队列 BlockingQueue 详解 本文目录: 1.CountDownLatch的基本概述 2.CountDownLatch的使用案例 3.CountDownLatch的源 ...

  4. Java 中的并发工具类

    From: https://blog.wuwii.com/juc-utils.html java.util.concurrent 下提供了一些辅助类来帮助我们在并发编程的设计. 学习了 AQS 后再了 ...

  5. 《Java并发编程的艺术》读书笔记 - 第八章 - Java中的并发工具类

    目录 前言 等待多线程完成的 CountDownLatch 示例 同步屏障 CyclicBarrier 示例 CyclicBarrier 和 CountDownLatch 的区别 控制并发线程数量的 ...

  6. (面经总结)一篇文章带你完整复习 Java 中并发关键字(CountDownLatch/CyclicBarrier/Semaphore/Volatile)

    文章目录 一.倒计数器:CountDownLatch 二.循环栅栏:CyclicBarrier 三.信号量:Semaphore 四.volatile 关键字的作用 一.倒计数器:CountDownLa ...

  7. 第8章 java中的并发工具类

    8.1 等待线程完成的CountDownLatch 作用:让一个线程等待其余线程完成之后在继续执行,如主线程等待开启服务的子线程执行完毕后主线程继续执行,类似于join. 转载于:https://ww ...

  8. Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

    之前谈过高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 ,以及高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurre ...

  9. java中的并发类_java中并发常用工具类

    前言:在你无聊的时候,想想比你优秀还努力的人,也许就不觉的无聊了 今天下午没事干把买的java并发编程艺术这本书拿出来看了看,看了下也记不住,还是好记性不如烂笔头,今天讲四个并发中可能会用到的工具类, ...

最新文章

  1. Python之路【第五篇】:面向对象及相关
  2. 我的C#学习笔记(1)
  3. 关于xilinx fir use reloadable coefficient的用法
  4. PHP中对数据库操作的封装
  5. 理解并演示:Root Guard(根保护)
  6. 七种寻址方式(直接寻址方式)
  7. javascript - 你不容错过的es6模板写法
  8. MyBatis中Like语句使用方式
  9. hive insert into语句 和 insert overwrite语句
  10. CAD转KML乱码处理
  11. PC端调用摄像头扫描二维码,拿到二维码信息
  12. Single-Shot Object Detection with Enriched Semantics 论文笔记
  13. 自动擦地机器人需要怎么留电_irobot擦地机器人是否好用,需要和扫地机器人配合么?...
  14. Lotus Sametime
  15. 想用FPGA加速神经网络,这两个开源项目你必须要了解
  16. 密码必须包含字母大小写、数字、特殊字符,且不能少于8位
  17. C语言篇 - (1)初识C语言 - (1)什么是C语言
  18. 30天自制操作系统第三天
  19. php 表单模板,迅睿CMS 网站表单模板
  20. python人名最多数统计,【Python 测验03】人名最多数统计

热门文章

  1. 【快速入门系列】简述 for...in 和 for...of 区别
  2. ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信
  3. 《为iPad而设计:打造畅销App》——大胆创意
  4. HUST 1586 数字排列
  5. Android不同分辨率和不同密度适配
  6. Hyper-V虚拟化测试05防火墙及证书配置
  7. 百度重置页面自动跳转脚本
  8. INODE上网IP地址刷新超时处理
  9. 通过显微镜,人们又看到了一个活生生的但是肉眼看不到的世界。透过成千上万的点击数据,在线世界也就变得更为鲜活,更有意义了。...
  10. 是男人就下100层【第四层】——Crazy贪吃蛇(2)