package function.thread;
import java.util.concurrent.CountDownLatch;
/**
* 示例:CountDownLatch的使用举例
* CountDownLatch是一个功能强大且易于使用的对象,主要适用于
* 当前线程必须等待一个或多个事件发生的时候
*/
public class TestCountDownLatch {
private static final int N = 10;
public static void main(String[] args) throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
CountDownLatch startSignal = new CountDownLatch(1);//开始执行信号
for (int i = 1; i <= N; i++) {
//线程启动后,处于就绪状态
new Thread(new Worker(i, doneSignal, startSignal)).start();//线程启动了
}
System.out.println("begin------------");
//子线程都调用了await方法,所以当前线程不变更计数器,子线程就会被阻塞
startSignal.countDown();//计数器大于0,线程被阻塞。另外,阻塞并不等于线程执行完毕
//sleep太久,子线程可能都执行完毕了
Thread.sleep(10);//为了更好地看到各线程的竞争,否则可能是主线程一直先执行如下语句
System.out.println(" 我是主线程,也是线程。我也会加入到和子线程竞争的队伍中.....");
//此处可以是当前线程的阻塞点
doneSignal.await();//当前线程等待所有的线程执行完毕
System.out.println("main thread end 。。。。。。");
}
static class Worker implements Runnable {
private final CountDownLatch doneSignal;
private final CountDownLatch startSignal;
private int beginIndex;
Worker(int beginIndex, CountDownLatch doneSignal,
CountDownLatch startSignal) {
this.startSignal = startSignal;
this.beginIndex = beginIndex;
this.doneSignal = doneSignal;
}
public void run() {
try {
//防止主线程未执行,而子线程先执行的情况,
//所以任何子线程都要先等待
startSignal.await(); //等待开始执行信号的发布,每个线程都会不断的检测放行的信号
beginIndex = (beginIndex - 1) * 10 + 1;
for (int i = beginIndex; i <= beginIndex + 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+" wake up......");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
doneSignal.countDown();
}
}
}
}
运行结果:
begin------------
Thread-3:31
Thread-3:32
Thread-0:1
Thread-3:33
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-1:11
Thread-1:12
Thread-1:13
Thread-1:14
Thread-1:15
Thread-1:16
Thread-9:91
Thread-8:81
Thread-8:82
Thread-1:17
Thread-4:41
Thread-4:42
Thread-4:43
Thread-4:44
Thread-4:45
Thread-4:46
Thread-4:47
Thread-4:48
Thread-4:49
Thread-4:50
Thread-4:51
Thread-0:9
Thread-0:10
Thread-0:11
Thread-6:61
Thread-5:51
Thread-6:62
Thread-6:63
Thread-6:64
Thread-2:21
Thread-2:22
Thread-2:23
Thread-2:24
Thread-2:25
Thread-2:26
Thread-2:27
Thread-7:71
Thread-3:34
Thread-7:72
Thread-3:35
Thread-2:28
Thread-6:65
Thread-5:52
Thread-1:18
Thread-1:19
Thread-1:20
Thread-8:83
Thread-8:84
Thread-9:92
Thread-8:85
Thread-1:21
Thread-5:53
Thread-6:66
Thread-2:29
Thread-3:36
Thread-7:73
Thread-3:37
Thread-2:30
Thread-2:31
Thread-6:67
Thread-6:68
Thread-5:54
Thread-8:86
Thread-9:93
Thread-9:94
Thread-8:87
Thread-5:55
Thread-5:56
Thread-6:69
Thread-3:38
Thread-7:74
Thread-3:39
Thread-6:70
Thread-5:57
Thread-8:88
Thread-9:95
Thread-8:89
Thread-5:58
Thread-5:59
Thread-5:60
Thread-5:61
Thread-6:71
Thread-3:40
Thread-7:75
Thread-3:41
Thread-8:90
Thread-9:96
Thread-8:91
Thread-7:76
Thread-9:97
Thread-9:98
Thread-9:99
Thread-9:100
Thread-7:77
Thread-9:101
Thread-7:78
Thread-7:79
Thread-7:80
Thread-7:81
我是主线程,也是线程。我也会加入到和子线程竞争的队伍中.....
Thread-4 wake up......
Thread-0 wake up......
Thread-1 wake up......
Thread-2 wake up......
Thread-3 wake up......
Thread-6 wake up......
Thread-8 wake up......
Thread-5 wake up......
Thread-9 wake up......
Thread-7 wake up......
main thread end 。。。。。。
相关推荐
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
主要介绍了JAVA多线程CountDownLatch的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成) 2)CyclicBarrier(循环屏障:同步屏障) 3)Semaphore(信号量:控制并发进程数) 主要参考资料:java并发编程的艺术、Java并发——...
多线程相关的(具体包括Lock synchronized Join ThreadLocal Executors CountDownLatch等)一些demo。
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
内容概要:最新2023年Java高并发多线程后端面试题整理, 包含线程池,并发集合,volatile,CountDownLatch,Semaphore,Phaser,AQS,ReentrantLock,ReentrantLock等等问题, 用简洁明了的语言,通俗易懂地阐述了高...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...
实现多线程任务的同步 3.1 场景介绍 3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 ...
目录 CountDownLatch是什么? CountDownLatch如何工作? 在实时系统中的应用场景 应用范例 常见的面试题 代码样例
importExcel 方法接收一个 Excel 文件对象、批大小 batchSize 和线程数 threadCount 作为参数。首先,使用 ExcelReader 对象读取 Excel 文件,并计算出总行数和分片大小和数量;然后,创建一个固定数量的线程池,...
CountDownLatch与thread.join()的区别