java并发包工具(java.util.Concurrent)
一、CyclicBarrier
作用:所有线程准备好才进行,只要一条线程没准备好,都不进行
用法:所有线程准备好以后调用CyclicBarrier的await方法,然后主线程执行CyclicBarrier的countDown方法
实现需求:n个运动员(n个线程),全部准备好了才一起起跑。代码如下
1 package concurrent019;
2 import java.io.IOException;
3 import java.util.Random;
4 import java.util.concurrent.BrokenBarrierException;
5 import java.util.concurrent.CyclicBarrier;
6 import java.util.concurrent.ExecutorService;
7 import java.util.concurrent.Executors;
8 public class UseCyclicBarrier {
9
10 static class Runner implements Runnable {
11 private CyclicBarrier barrier;
12 private String name;
13
14 public Runner(CyclicBarrier barrier, String name) {
15 this.barrier = barrier;
16 this.name = name;
17 }
18 @Override
19 public void run() {
20 try {
21 Thread.sleep(1000 * (new Random()).nextInt(5));
22 System.out.println(name + " 准备OK.");
23 barrier.await();
24 } catch (InterruptedException e) {
25 e.printStackTrace();
26 } catch (BrokenBarrierException e) {
27 e.printStackTrace();
28 }
29 System.out.println(name + " Go!!");
30 }
31 }
32
33 public static void main(String[] args) throws IOException, InterruptedException {
34 CyclicBarrier barrier = new CyclicBarrier(3); // 3
35 ExecutorService executor = Executors.newFixedThreadPool(3);
36
37 executor.submit(new Thread(new Runner(barrier, "zhangsan")));
38 executor.submit(new Thread(new Runner(barrier, "lisi")));
39 executor.submit(new Thread(new Runner(barrier, "wangwu")));
40
41 executor.shutdown();
42 }
43
44 }
二、CountDownLacth
作用:监听某些初始化操作,等初始化执行完毕以后,通知主线程继续工作(例如zk的初始化)
用法:将需要别的线程来通知的线程调用CountDownLacth的await方法,其他线程执行了之后,允许这个线程执行的时候,执行CountDownLacth的countDown方法
实现需求:启动3个线程,1线程等待2和3线程执行完毕以后再执行,代码如下:
1 package concurrent019;
2
3 import java.util.concurrent.CountDownLatch;
4
5 public class UseCountDownLatch {
6
7 public static void main(String[] args) {
8
9 final CountDownLatch countDown = new CountDownLatch(2);
10
11 Thread t1 = new Thread(new Runnable() {
12 @Override
13 public void run() {
14 try {
15 System.out.println("进入线程t1" + "等待其他线程处理完成...");
16 countDown.await();
17 System.out.println("t1线程继续执行...");
18 } catch (InterruptedException e) {
19 e.printStackTrace();
20 }
21 }
22 },"t1");
23
24 Thread t2 = new Thread(new Runnable() {
25 @Override
26 public void run() {
27 try {
28 System.out.println("t2线程进行初始化操作...");
29 Thread.sleep(3000);
30 System.out.println("t2线程初始化完毕,通知t1线程继续...");
31 countDown.countDown();
32 } catch (InterruptedException e) {
33 e.printStackTrace();
34 }
35 }
36 });
37 Thread t3 = new Thread(new Runnable() {
38 @Override
39 public void run() {
40 try {
41 System.out.println("t3线程进行初始化操作...");
42 Thread.sleep(4000);
43 System.out.println("t3线程初始化完毕,通知t1线程继续...");
44 countDown.countDown();
45 } catch (InterruptedException e) {
46 e.printStackTrace();
47 }
48 }
49 });
50
51 t1.start();
52 t2.start();
53 t3.start();
54
55 }
56 }
ps:CyclicBarrier和CountDownLacth的区别
CyclicBarrier是所有线程等待一个线程的信号,CountDownLacth是一个线程等待所有线程的信号
三、Callable、Future
Future实现的就是前面讲的Future模式.
实现功能:主线程在执行的过程中,调用了一个或者多个耗时的操作,需要把这个耗时的操作提到另几个线程操作(这几个耗时的操作可以并行执行)
代码实现:
1 package concurrent019;
2
3 import java.util.concurrent.Callable;
4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.FutureTask;
7
8 public class UseFuture implements Callable<String>{
9 private String para;
10
11 public UseFuture(String para){
12 this.para = para;
13 }
14
15 /**
16 * 这里是真实的业务逻辑,其执行可能很慢
17 */
18 @Override
19 public String call() throws Exception {
20 //模拟执行耗时
21 Thread.sleep(3000);
22 String result = this.para + "处理完成";
23 return result;
24 }
25
26 //主控制函数
27 public static void main(String[] args) throws Exception {
28 String queryStr = "query";
29 //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
30 FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));
31 //创建一个固定线程的线程池且线程数为1,
32 ExecutorService executor = Executors.newFixedThreadPool(1);
33 //这里提交任务future,则开启线程执行RealData的call()方法执行
34 executor.submit(future);
35 System.out.println("请求完毕");
36 try {
37 //这里可以做额外的数据操作,也就是主程序执行其他业务逻辑
38 Thread.sleep(2000);
39 } catch (Exception e) {
40 e.printStackTrace();
41 }
42 //调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
43 System.out.println("数据:" + future.get()); // 其实这块应该开启线程处理
44 executor.shutdown();
45 }
46
47 }
四、Semaphore(信号量)
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有实际的许可证这个对象,Semaphore只是维持了一个可获得许可证的数量。(用于限流)
实现需求:总共有20条线程,但是最多只能放5条线程进来执行
代码实例:
1 package concurrent019;
2
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5 import java.util.concurrent.Semaphore;
6
7 public class UseSemaphore {
8
9 public static void main(String[] args) {
10 // 线程池
11 ExecutorService exec = Executors.newCachedThreadPool();
12 // 只能5个线程同时访问
13 final Semaphore semp = new Semaphore(5);
14 // 模拟20个客户端访问
15 for (int index = 0; index < 20; index++) {
16 final int NO = index;
17 Runnable run = new Runnable() {
18 public void run() {
19 try {
20 // 获取许可
21 semp.acquire();
22 System.out.println("Accessing: " + NO);
23 //模拟实际业务逻辑
24 Thread.sleep((long) (Math.random() * 10000));
25 // 访问完后,释放
26 semp.release();
27 } catch (InterruptedException e) {
28 }
29 }
30 };
31 exec.execute(run);
32 }
33
34 try {
35 Thread.sleep(10);
36 } catch (InterruptedException e) {
37 e.printStackTrace();
38 }
39
40 //System.out.println(semp.getQueueLength());
41
42
43
44 // 退出线程池
45 exec.shutdown();
46 }
47
48 }
java并发包工具(java.util.Concurrent)的更多相关文章
- 八、jdk工具之JvisualVM、JvisualVM之二--Java程序性能分析工具Java VisualVM
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...
- Java反编译工具(Java Decompiler)
Java Decompiler是一种非常实用的JAVA反编译工具,可以对整个jar包进行反编译,也可以将其集成到eclipse上,非常方便的根据class文件的源码.,官网地址http://jd.be ...
- Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器
VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收 ...
- Java静态检测工具/Java代码规范和质量检查简单介绍(转)
静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...
- 201671010133 2016-2017-2 《java程序设计》 初学java!
新学期伊始,我心中既充满了期待和希望,又有些许激动和感慨.期待的是即将接触许多新的知识,期待未来比过去过的更加踏实有趣,期待遇到更好的人和事等等.当然,面对从未了解过的新事物时,我想每个人的想法都大致 ...
- java CountDownLatch报错java.lang.IllegalMonitorStateException: null
笔者使用websocket进行通信,服务器异步返回.websocket服务器又异步调用其他websocket,也是异步访问. 由于无法预测服务器调用第三方websocket什么时候调用结束,使用了Co ...
- netty-websocket-spring-boot-starter关闭报错 io/netty/channel/AbstractChannel$AbstractUnsafe io/netty/util/concurrent/GlobalEventExecutor
报错 java.lang.NoClassDefFoundError: io/netty/channel/AbstractChannel$AbstractUnsafe$ at io.netty.chan ...
- Java并发—java.util.concurrent并发包概括(转载)
一.描述线程的类:Runable和Thread都属于java.lang包 二.内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/noti ...
- java.util.concurrent中的几种同步工具类
java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...
随机推荐
- Python匹配对象的groups、groupdict和group之间的关系
匹配对象的groups()方法返回一个包含所有参与匹配的子组(不含组0)的匹配到的搜索文本子串的元组,groupdict返回一个包含所有匹配到的命名组的组名为键值和命名组匹配到的搜索文本子串为值作为元 ...
- js内存泄漏的问题?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在. 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量.如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环 ...
- 从.NET转GO了
前言 近几个月刚从.NET转到GO,入职了一个使用GO微服务的互联网公司.因为需要熟悉公司的微服务架构和适应新公司的节奏,所以最近没时间写博客,现在简单做个总结. 转GO的经历 自学GO 上一年的八月 ...
- Apriori 算法-如何进行关联规则挖掘
公号:码农充电站pro 主页:https://codeshellme.github.io 在数据分析领域有一个经典的故事,叫做"尿布与啤酒". 据说,在美国西部的一家连锁超市发现, ...
- filebeat输出结果到elasticsearch的多个索引
基本环境: filebeat版本:6.5.4 (Linux,x86-64) elasticsearch版本:6.54 (一)需求说明 在一台服务器上有多个日志需要使用filebeat日志收集到el ...
- BJOI2017 机动训练
落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...
- TMOOC-1709-小明复仇
题目描述 小明所在的世界上一共有n个城市,城市间有m条双向道路.小明现在在城市1,他想到位于城市n的小韩隆家询问他为什么没有将自己的五三复原完成.由于小韩隆手下有许多小弟,小明担心自己可能再也回不来, ...
- 廖雪峰官网学习js 数组
indexOf( ) 某字符的位置 slice 相当于string 的substring 切片 a = ['a','b',1,2,3] (5) ["a", "b&q ...
- Angular学习知识点记录
问:版本直接跳转到Angular4? 答:为了遵循严格的版本策略.在angular2.x的时候,angular route的版本已经是版本3了.因此为了版本统一,angular直接从2跳到了4,.参考 ...
- Angular:使用前端proxy代理解决跨域问题
①在项目文件的根目录下新建文件proxy.config.json { "/": { "target": "http://127.0.0.1:3000& ...