Java并发工具辅助类代码实例
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并发工具辅助类代码实例相关推荐
- java中thread实例_Java多线程并发执行demo代码实例
主类:MultiThread,执行并发类 package java8test; import java.util.ArrayList; import java.util.List; import ja ...
- Java并发工具类(闭锁CountDownLatch)
并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...
- 玩转java并发工具_玩Java并发
玩转java并发工具 最近,我需要将一些文件(每个文件都有JSON格式的对象列表(数组))转换为每个文件都具有相同数据(对象)的分隔行的文件. 这是一次性的任务,很简单. 我使用Java nio的某些 ...
- 彻底理解Java并发:Java并发工具类
本篇内容包括:Java 并发工具类的介绍.使用方式与 Demo,包括了 CountDownLatch(线程计数器).CyclicBarrier(回环栅栏).Semaphore(信号量) 以及 Exch ...
- Java并发工具类(三)Exchanger
Java并发工具类(三)Exchanger 在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有: CountDownLatch Sema ...
- java编写螺旋矩阵讲解_Java如何实现螺旋矩阵 Java实现螺旋矩阵代码实例
本篇文章小编给大家分享一下Java实现螺旋矩阵代码实例,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时 ...
- java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...
这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...
- 理解java并发工具Phaser
java为我们提供了很多并发工具,比如Semaphore.CountDownLatch.CyclicBarrier还有我们这里要讲到的phaser. 当某些任务是分成多个步骤来执行时,并且同一个步骤之 ...
- Java并发工具类Semaphore应用实例
1 package com.thread.test.thread; 2 3 import java.util.Random; 4 import java.util.concurrent.*; 5 6 ...
最新文章
- Java8新特性系列(Lambda)
- 零基础学Python-爬虫-2、scrapy框架(测试案例篇·技术点在后面文章内讲解)【测试将一篇小说的所有访问路径与标题存储到一个文件下】
- 前端学习(2185):tabberitem的颜色动态
- xpath获取标签的属性值_论xpath与css定位方式
- java 注解入门 简书_Java基础-注解
- 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)
- libevent的线程优雅的退出方式
- Android 系统(59)---Android开发:Handler异步通信机制全面解析(包含Looper、Message Queue)
- c语言高效编程pdf,C语言高效编程的四大绝招
- Python读取word文档(python-docx包)
- (洛谷)P2709 小B的询问
- [转载] 柯受良-柯受良飞跃黄河
- 多商户商城小程序系统(附微信抖音小程序商城分销系统源码)
- oppoA37m rom固件刷机包下载 免费下载 解锁专用
- 全自动化处理每月缺卡数据,输出缺卡人员信息
- 28法则在建站、优化、运维中的体现
- 文献检索报告软件测试,文献检索报告及文献综述.doc
- 大学计算机基础实验3word表格,实验3word2010制作表格和插入对象土木2班滕成(1)
- 基于MITRE ATTCK的Red Teaming行动实践
- mysql内部联结_MySQL联结表
热门文章
- MAC电脑外设键盘如何更改command为control键MAC电脑外设键盘如何更改command为control键...
- 产生分类中的双月问题的数据集
- 教你快速开发一个 狼人杀微信小程序(附源码)
- Facebook想要成为下一个微信,难! 1
- SQLiteSpy执行Sql语句提示No such collation sequence : PhoneBook
- arduino触须传感器使用方法
- 坤宝德万达打造命运共同体万达茂天樾之夜.时光发声全国巡回演唱会南宁站圆满结束
- monit 内存 监控_mac系统监控软件Monity for Mac
- 云监控介绍 - Amazon CloudWatch
- verilog键盘输入示例代码及分析(摩尔型有限状态机)