一、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)的更多相关文章

  1. 八、jdk工具之JvisualVM、JvisualVM之二--Java程序性能分析工具Java VisualVM

    目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...

  2. Java反编译工具(Java Decompiler)

    Java Decompiler是一种非常实用的JAVA反编译工具,可以对整个jar包进行反编译,也可以将其集成到eclipse上,非常方便的根据class文件的源码.,官网地址http://jd.be ...

  3. Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器

    VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收 ...

  4. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  5. 201671010133 2016-2017-2 《java程序设计》 初学java!

    新学期伊始,我心中既充满了期待和希望,又有些许激动和感慨.期待的是即将接触许多新的知识,期待未来比过去过的更加踏实有趣,期待遇到更好的人和事等等.当然,面对从未了解过的新事物时,我想每个人的想法都大致 ...

  6. java CountDownLatch报错java.lang.IllegalMonitorStateException: null

    笔者使用websocket进行通信,服务器异步返回.websocket服务器又异步调用其他websocket,也是异步访问. 由于无法预测服务器调用第三方websocket什么时候调用结束,使用了Co ...

  7. 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 ...

  8. Java并发—java.util.concurrent并发包概括(转载)

    一.描述线程的类:Runable和Thread都属于java.lang包 二.内置锁synchronized属于jvm关键字,内置条件队列操作接口Object.wait()/notify()/noti ...

  9. java.util.concurrent中的几种同步工具类

    java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...

随机推荐

  1. TextClip构造方法报OSError:MoviePy creation of None failed because of the following [WinError 2]系统找不到指定的文件

    ☞ ░ 前往老猿Python博文目录 ░ 在使用moviepy的构造方法创建实例时报错: "C:\Program Files\Python37\python.exe" F:/stu ...

  2. 第15.30节 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint消息画出scrollAreaWidgetContents的范围矩形

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...

  3. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中toolBar的toolButtonStyle属性

    tooButtonStyle属性保存主工具栏按钮的样式设置,用来表示工具栏按钮的文字和图标怎么显示. 该属性的可设置值类型为枚举类型Qt.ToolButtonStyle,它包含如下值: 该属性的缺省值 ...

  5. 直接插入排序(python实现)

    这篇博文用来介绍直接插入排序 直接插入排序基本思想: 每次将一个待排序的记录插入到已经排好序的数据区中,直到全部插入完为止 直接插入排序算法思路: 在直接插入排序中,数据元素分为了有序区和无序区两个部 ...

  6. Robot framework 环境搭建+图标处理

    场景:随着现在项目各种赶工,很多时候界面上的功能还没有实现,这时就可以先对接口进行验证,提早发现一些和预期不一致的错误. Robot framework需要的几个知识点: 测试库:RF是大树,测试库就 ...

  7. 再次学习sql注入

    爆所有数据库 select schema_name from information_schema.schemata 先爆出多少个字段 id = 1 order by ?; mysql5.0及以上 都 ...

  8. 条件循环语句组成了Python代码的骨架

    条件控制 我们都知道流程图是有多个分支的,程序中也是如此,在Python中是用if语句来判断程序该走哪个分支的.它的执行过程如下: 代码执行过程如下: if if语句的一般形式如下: if condi ...

  9. CF392B Tower of Hanoi

    题目链接. Description 三塔汉诺塔问题,给一个 \(3 \times 3\) 的矩阵 \(t\),\(t_{i, j}\) 表示从 \(i\) 塔移动一个盘子到 \(j\) 塔的花费. 初 ...

  10. AcWing 316 .减操作

    题目链接 大型补档计划 没想出来去看题解了... 关键是发现无论怎样括号嵌套,每个元素始终只有对答案的贡献为 + a[i] 或者 - a[i]. 而且第一个必然贡献是 +1, 第二个必然是 -1. 所 ...