join 与 countdownlatch 的区别 扩展 栅栏 CyclicBarrier
我们先看一个 小例子 , 使用 join 与CountDownSlatch 都可以完成 当1,2线程 完全结束后 3 线程 start 对比我们就能够知道 CountDownSlatch 比 JOIN 更能够控制粒度 因为 他只要 计数 为0 就好
package com.ghc.mmall.concurrency.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author :Frank Li
* @date :Created in 2019/7/18 10:30
* @description:${description}
* @modified By:
* @version: $version$
*/
public class JoinTest {
public static void main(String [] args){
Thread work1Thread = new Thread(new Workder());
work1Thread.setName("work1Thread");
Thread work2Thread = new Thread(new Workder());
work2Thread.setName("work2Thread");
List<Thread> threads = new ArrayList<>();
threads.add(work1Thread);
threads.add(work2Thread);
for(Thread thread:threads){
thread.start();
}
for(Thread thread:threads){
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread work3Thread = new Thread(new Workder());
work3Thread.setName("work3Thread");
work3Thread.start();
// System.out.println(Thread.currentThread().getName()+" ");
}
}
class Workder implements Runnable{
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"--> 开始工作");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+"--> 第一阶段完成了");
}catch(InterruptedException e){
}
}
}
output:
work1Thread--> 开始工作
work2Thread--> 开始工作
work2Thread--> 第一阶段完成了
work1Thread--> 第一阶段完成了
work3Thread--> 开始工作
work3Thread--> 第一阶段完成了
使用 CountDownSlatch 很显然 粒度会更小
package com.ghc.mmall.concurrency.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
* @author :Frank Li
* @date :Created in 2019/7/18 11:30
* @description:${description}
* @modified By:
* @version: $version$
*/
public class CountDownSlatchTest {
private static final CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String [] args){
Thread worker1 = new Thread(new Worker(countDownLatch),"worker1");
Thread worker2 = new Thread(new Worker(countDownLatch), "worker2");
Thread worker3 = new Thread(new Worker(countDownLatch), "worker3");
List<Thread> threads = new ArrayList<>(3);
threads.add(worker1);
threads.add(worker2);
threads.add(worker3);
for(Thread thread:threads){
thread.start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(Thread thread:threads){
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Worker implements Runnable{
private CountDownLatch countDownLatch;
Worker(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"--> 开始第一阶段任务...");
try{
Thread.sleep(2000);
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName()+"--> 结束第一阶段任务...");
}catch (InterruptedException e){
}
try {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+"--> 开始第二阶段任务...");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--> 结束第二阶段任务...");
}
}
output:
worker1--> 开始第一阶段任务...
worker2--> 开始第一阶段任务...
worker3--> 开始第一阶段任务...
worker1--> 结束第一阶段任务...
worker2--> 结束第一阶段任务...
worker3--> 结束第一阶段任务...
worker1--> 开始第二阶段任务...
worker1--> 结束第二阶段任务...
worker2--> 开始第二阶段任务...
worker2--> 结束第二阶段任务...
worker3--> 开始第二阶段任务...
worker3--> 结束第二阶段任务...
总结
join 与 countdownlatch 的区别 扩展 栅栏 CyclicBarrier的更多相关文章
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier
1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public Count ...
- 循环屏障CyclicBarrier以及和CountDownLatch的区别
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...
- java CyclicBarrier以及和CountDownLatch的区别
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的 ...
- Join 与 CountDownLatch 之间的区别
Join 与 CountDownLatch 之间的区别 import java.util.concurrent.CountDownLatch; public class CountDownLatchT ...
- join和countDownLatch原理及区别详解
先上结论 原理 join 原理:在当前线程中调用另一个线程线程 thread 的 join() 方法时,会调用该 thread 的 wait() 方法,直到这个 thread 执行完毕(JVM在 ru ...
- 闭锁CountDownLatch与栅栏CyclicBarrier
https://blog.csdn.net/lmc_wy/article/details/7866863 闭锁CountDownLatch与栅栏CyclicBarrier 浅谈 java ...
- 多线程-栅栏CyclicBarrier
上一篇总结了闭锁CountDownLatch,这一篇总结一下栅栏CyclicBarrier.它们两者之间的区别主要是,闭锁是等待一个事件发生,比如上一篇的田径比赛,运动员等待裁判哨声一响就可以开始跑, ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
随机推荐
- mongo 是什么
一.概述1.MongoDB是什么?用一句话总结MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统.没错MongoDB就是数据库,是NoSQL类型的数据库 2.为什么要使用Mong ...
- 网络1911、1912 C语言第2次作业--循环结构 批改总结
一.评分规则 伪代码务必是文字+代码描述,直接反应代码,每题扣1分 提交列表没内容,或者太简单,每题得分0分.注意选择提交列表长的题目介绍. 代码格式不规范,继续扣分. 代码互评,内容简单,0分. 原 ...
- What is the most efficient way to deep clone an object in JavaScript?
What is the most efficient way to deep clone an object in JavaScript? Reliable cloning using a libra ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- win2003 64位系统IIS配置方法
IIS7 很简单,在网站对应的应用程序池上右键高级设置,常规里的启用32位应用程序改为true就可以了,IIS6稍微复杂一些, 1,命令行里运行 cscript.exe %SYSTEMDRIVE%\i ...
- oracle字段like多个条件
写oracle sql时有时候会有 and (字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ...)这样的情况出现,下面提供一个简洁点的解决方案: and REGEXP_LIKE ...
- Python 基础语法_Python脚本文件结构
目录 目录 前言 软件环境 Python Script文件结构 导入模块的流程 Python的包package 最后 前言 Python基础语法这一章,主要记录了Python的文件结构.逻辑运算符.算 ...
- Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)
示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...
- sql语言(mysql)
一.SQL语言 1.DDL (Data Definition Language) 数据库定义语言 2.DML(Data Manipulation Language) 数据库操作语言 3.DQL (Da ...
- 【Qt开发】QScrollArea添加布局后没有出现滚动条的解决方法
[Qt开发]QScrollArea添加布局后没有出现滚动条的解决方法 标签:[Qt开发] 说明:尝试利用滚动区域显示多张图片,为了能够动态地往滚动区域贴图,为滚动区域设置了布局,然后通过布局来添加wi ...