并发编程之CountDownLatch
在前面的两篇文章中我们分别用volatile、notify()和wait()分别实现了一个场景,我们再来回顾一下前面的场景:在main方法中开启两个线程,其中一个线程t1往list里循环添加元素,另一个线程t2监听list中的size,当size等于5时,t2线程结束,t1线程继续执行,直到循环结束。看过上篇文章的应该知道上篇文章我们是用notify()和wait()配合来实现线程之间的交互的,但是这种方法不是很好理解,而且写起来比较麻烦,在notify()之后必须要wait()才能立即释放锁,而且wait()方法执行之前必须是要先获得锁的,这就意味着wait()方法必须在synchronized方法或者是synchronized代码块之中来执行,这并不是很方便,本文中我们将用另一种更为简单且容易理解的方式来实现这个场景,下面直接看代码:
package com.fanjf.thread; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; public class Mycontainer3 {
static List<Integer> integers = new ArrayList<>();
final static Object object = new Object();
static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
System.out.println("t1启动");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for(int i=0;i<10;i++){
integers.add(i);
if(integers.size()==5){
latch.countDown();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("add:"+i); }
System.out.println("t1结束"); }
}).start(); new Thread(new Runnable() {
public void run() {
System.out.println("t2启动");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2结束"); } }).start();
} }
执行结果如下:
t1启动
t2启动
add:0
add:1
add:2
add:3
t2结束
add:4
add:5
add:6
add:7
add:8
add:9
t1结束
很明显,这个结果跟我们的描述是一致的,现在来解释一下代码的意思,java并发包中为我们提供了一个CountDownLatch类,这个类的构造方法中可以传一个int值,首先线程t2执行await()方法,线程t1执行add操作,当size等于5时执行countDown(),这个countDown()会把传入的int值减1,只有当这个值减为0时,t2线程才能执行,所以当size等于5时此时值会减为0,t2就会继续执行了。
并发编程之CountDownLatch的更多相关文章
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
- Java并发编程之CountDownLatch
一.场景描述 在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景 例如:百米赛跑,十名运动员同时起跑,由于速度的快慢,肯定有先到达和后到达的,而终点有个统计成绩的仪器,当所有选手到达终点时 ...
- 多线程进阶——JUC并发编程之CountDownLatch源码一探究竟
1.学习切入点 JDK的并发包中提供了几个非常有用的并发工具类. CountDownLatch. CyclicBarrier和 Semaphore工具类提供了一种并发流程控制的手段.本文将介绍Coun ...
- Java并发编程之CountDownLatch的用法
一.含义 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待, ...
- 并发编程之:CountDownLatch
大家好,我是小黑,一个在互联网苟且偷生的农民工. 先问大家一个问题,在主线程中创建多个线程,在这多个线程被启动之后,主线程需要等子线程执行完之后才能接着执行自己的代码,应该怎么实现呢? Thread. ...
- 并发编程之 Exchanger 源码分析
前言 JUC 包中除了 CountDownLatch, CyclicBarrier, Semaphore, 还有一个重要的工具,只不过相对而言使用的不多,什么呢? Exchange -- 交换器.用于 ...
- 并发编程之J.U.C的第二篇
并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类 ...
- [转载]并发编程之Operation Queue和GCD
并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...
- Java并发编程之CAS
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...
随机推荐
- (办公)mybatis工作中常见的问题(不定时更新)
1.mybatis的like查询的方式. <if test="shopName != null and shopName != ''"> <bind name=& ...
- MyDAL - .QueryOneAsync() 使用
索引: 目录索引 一.API 列表 .QueryOneAsync() .QueryOneAsync<M>() 如: .QueryOneAsync<Agent>() , 用于 单 ...
- vue build报copy-webpack-plugin] unable to locate异常的解决方法
ERROR in [copy-webpack-plugin] unable to locate 'J:\xxx\xxx\xxx\xxx\static' at 'J:\xxx\xxx\xxx\xxx\s ...
- hadoop wordcout测试
hadoop wordcout测试 安装好hadoop 环境后,启动HDFS等服务:输密码 1004 start-all.sh 查看启动情况 1006 jps 1007 cd ~ 切换到用户默认目录 ...
- 免费了 -- EXCEL插件 智表ZCELL 普及版V1.0 发布了!!!
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- springboot 定时任务
1.启动类新增注解 @EnableScheduling import org.springframework.boot.SpringApplication; import org.springfram ...
- 从输出日志中提取接口的入参和返回做为用例导入到excel中
1 背景 接口用例已经在项目中的yml文件中编写,但是yml文件不能做为交付文档用,本文对工作中从接口输出日志中提取用例信息,并导入到excel文件中做了总些 2 工具 idea,notepad+ ...
- 使用git 遇见的错误使用到的命令
查看远端地址 git remote -v 需要重新添加地址 git remote set-url origin xxx 远程新的地址 git remote add origin_new 设置用户名 ...
- 10分钟学会在Ubuntu 18.04 LTS上安装NFS服务器和客户端
https://www.linuxidc.com/Linux/2018-11/155331.htm
- 前端架构师 摘自《前端架构设计》-micah godbolt
作为前端架构师,你经常需要制定,或至少能够掌握以上所列的每一项内容.流程中的任何一个环节出现问题,都会迅速演变为开发人员的痛苦,或者导致网站无法持续满足用户要求,甚至崩溃. 前端架构师的用户是开发人 ...