java中的并发工具类

一:等待多线程完成的CountDownLatch

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

packag``.fuzhulei;
import java.util.concurrent.*;
​
/*** 减法计数器,主要是countDown(计数器1) 和 await(阻塞)方法,只有当计数器减为0的时候,当前线程才可以往下继续执行。* 主要用于允许一个或多个线程等待其他线程完成操作* @author Huxudong* @createTime 2020-04-05 00:04:36**/
public class CountDownDemo {public static void main(String[] args) throws InterruptedException {/** 使用其构造函数,创建一个数值为6的计数器 */CountDownLatch countDownLatch = new CountDownLatch(6);/** 自定义线程池使用 */ExecutorService pool = new ThreadPoolExecutor(6,  // 核心线程池大小9, // 最大线程池的大小(根据是IO密集型,还是CPU密集型来确定大小)3L,  // 超时等待时间TimeUnit.SECONDS,  // 时间的单位new LinkedBlockingQueue<>(5), // 阻塞队列是哪一种Executors.defaultThreadFactory(),   // 默认线程创建工厂new ThreadPoolExecutor.AbortPolicy()  // 四大拒绝策略,选择一种);try{for (int i = 0; i < 6; i++) {/** 这个线程的提交,没有返回值的任务 */pool.execute(()->{countDownLatch.countDown();System.out.println(Thread.currentThread().getName()+"执行一次减法");});
​}} catch(Exception e) {e.printStackTrace();} finally {/** 关闭线程池 */pool.shutdown();}
​countDownLatch.await();System.out.println("执行完成了");
​}
}

正确执行结果:

但是如果我们设置计数器的容量大于6的话(相对于我的程序而言),就会被阻塞在那里

会发现执行完成了 没有被打印出来,而且程序一直没有停止,这个时候就是因为计数器没有归0,所以当前线程被阻塞,不能向下面继续进行。

二:同步屏障CyclicBarrier

CyclicBarrier的翻译大致就是可循环的屏障。它主要的作用就是让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一份线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

package com.fuzhulei;
​
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
​
/*** CyclicBarrier是一个加法计数器,即同步屏障,可循环的屏障,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障,达到了一开始初始化的屏障的数值,* 屏障才可以打开门,所有被拦截的线程才可以继续工作,主要是通过调用await方法来实现的* @author Huxudong* @createTime 2020-04-04 22:53:50**/
public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier = new CyclicBarrier(3);new Thread(()->{​try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("线程A已经到达屏障");},"A").start();
​new Thread(()->{try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("线程B已经到达屏障");},"B").start();
​new Thread(()->{try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}System.out.println("线程C已经到达屏障");},"C").start();
​
​}
}

执行的结果如下:

但是如果把定义的容量大于3(相对于我的程序而言),就会发现什么都不会输出了,看截图

并且程序一直还没有停止,这就是屏障起到了作用,因为屏障要求至少需要4个(假设),但是此时只有三个线程到达,所以不满足,屏障就一直阻拦不放路,那么所有的线程也就被阻塞不能向下面继续运行,除非知道第四个过来,满足条件才会运行。

三:控制并发线程数的Semaphore

用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公用的资源。

package com.fuzhulei;
​
import java.util.concurrent.*;
​
/*** 用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公用的资源* @author Huxudong* @createTime 2020-04-04 23:45:29**/
public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(5);ExecutorService pool = new ThreadPoolExecutor(10,20,3L,TimeUnit.SECONDS,new LinkedBlockingQueue<>(20),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
​try{for (int i = 0; i < 60; i++) {pool.execute(() ->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"限流成功");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}});}} catch(Exception e) {e.printStackTrace();} finally {pool.shutdown();}}
}

执行的结果如下:

例如:数据库资源,假如需要读取几十万个数据的文件,因为都是IO密集型任务,所以开了2倍的处理器+1个线程数(IO密集型,所以线程可以多一些,让cpu忙起来,因为IO操作的时候,很少操作Cpu)

但是如果读到内存后,还需要存储到数据库中,但是数据库连接我们设置的加入就10个,所以我们必须控制只有10个线程可以同时访问数据库连接保存数据,否则会报错无法连接数据库异常。

总结

篇幅有限!篇幅有限!关于Java并发工具辅助类代码实例,就聊到这儿啦…啦…啦…
以上小编所介绍的全部相关的笔记资料都已整理成册,不论是Redis面试+Redis实战pdf,还是MongDB快速上手+MongDB集群安全等手写pdf笔记,想白嫖都很so easy!!
——如果你get到了,那就点个赞转发支持一波吧!
——整理不易,白嫖私信我领取源码学习资料,100%回复分享!
——也可以添加小助手VX:xcw18874131605获取资料哦
——祝前程似锦,offer不断,好好学习,天天向上!

Java并发工具辅助类代码实例相关推荐

  1. java中thread实例_Java多线程并发执行demo代码实例

    主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...

  2. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  3. 玩转java并发工具_玩Java并发

    玩转java并发工具 最近,我需要将一些文件(每个文件都有JSON格式的对象列表(数组))转换为每个文件都具有相同数据(对象)的分隔行的文件. 这是一次性的任务,很简单. 我使用Java nio的某些 ...

  4. 彻底理解Java并发:Java并发工具类

    本篇内容包括:Java 并发工具类的介绍.使用方式与 Demo,包括了 CountDownLatch(线程计数器).CyclicBarrier(回环栅栏).Semaphore(信号量) 以及 Exch ...

  5. Java并发工具类(三)Exchanger

    Java并发工具类(三)Exchanger 在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有: CountDownLatch Sema ...

  6. java编写螺旋矩阵讲解_Java如何实现螺旋矩阵 Java实现螺旋矩阵代码实例

    本篇文章小编给大家分享一下Java实现螺旋矩阵代码实例,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时 ...

  7. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  8. 理解java并发工具Phaser

    java为我们提供了很多并发工具,比如Semaphore.CountDownLatch.CyclicBarrier还有我们这里要讲到的phaser. 当某些任务是分成多个步骤来执行时,并且同一个步骤之 ...

  9. Java并发工具类Semaphore应用实例

    1 package com.thread.test.thread; 2 3 import java.util.Random; 4 import java.util.concurrent.*; 5 6 ...

最新文章

  1. Java8新特性系列(Lambda)
  2. 零基础学Python-爬虫-2、scrapy框架(测试案例篇·技术点在后面文章内讲解)【测试将一篇小说的所有访问路径与标题存储到一个文件下】
  3. 前端学习(2185):tabberitem的颜色动态
  4. xpath获取标签的属性值_论xpath与css定位方式
  5. java 注解入门 简书_Java基础-注解
  6. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)
  7. libevent的线程优雅的退出方式
  8. Android 系统(59)---Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue)
  9. c语言高效编程pdf,C语言高效编程的四大绝招
  10. Python读取word文档(python-docx包)
  11. (洛谷)P2709 小B的询问
  12. [转载] 柯受良-柯受良飞跃黄河
  13. 多商户商城小程序系统(附微信抖音小程序商城分销系统源码)
  14. oppoA37m rom固件刷机包下载 免费下载 解锁专用
  15. 全自动化处理每月缺卡数据,输出缺卡人员信息
  16. 28法则在建站、优化、运维中的体现
  17. 文献检索报告软件测试,文献检索报告及文献综述.doc
  18. 大学计算机基础实验3word表格,实验3word2010制作表格和插入对象土木2班滕成(1)
  19. 基于MITRE ATTCK的Red Teaming行动实践
  20. mysql内部联结_MySQL联结表

热门文章

  1. MAC电脑外设键盘如何更改command为control键MAC电脑外设键盘如何更改command为control键...
  2. 产生分类中的双月问题的数据集
  3. 教你快速开发一个 狼人杀微信小程序(附源码)
  4. Facebook想要成为下一个微信,难! 1
  5. SQLiteSpy执行Sql语句提示No such collation sequence : PhoneBook
  6. arduino触须传感器使用方法
  7. 坤宝德万达打造命运共同体万达茂天樾之夜.时光发声全国巡回演唱会南宁站圆满结束
  8. monit 内存 监控_mac系统监控软件Monity for Mac
  9. 云监控介绍 - Amazon CloudWatch
  10. verilog键盘输入示例代码及分析(摩尔型有限状态机)