- 浏览: 543913 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
c__海棠依旧:
很强,对于我这个新手很容易理解,准们登录来给你点赞的!
BeanFactory和FactoryBean -
hudazheng:
很清晰!
X86、X64和X86_64区别 -
hugh.wang:
...
BeanFactory和FactoryBean -
CB00J:
...
Executor框架和线程池 -
Arbow:
请教一个问题。现在互联网业务的数据库通常用分片方式来连接一组数 ...
BoneCP源码——概述
CountDownLatch类在java.util.concurrent包下,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。这直接通过代码来说明CountDownLatch的作用,可以实现一个人(也可以是多个人)等待其他所有人都来通知他,这犹如一个计划需要多个领导都签字后才能继续向下实施,还可以实现一个人通知多个人的效果,类似裁判一声口令,运动员同时开始奔跑。
构造方法
public CountDownLatch(int count)构造一个用给定计数初始化的CountDownLatch。 参数: count - 在线程能通过 await() 之前,必须调用 countDown() 的次数 抛出: IllegalArgumentException - 如果 count 为负
方法摘要
void await() 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。 boolean await(long timeout, TimeUnit unit) 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。 void countDown() 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。 long getCount() 返回当前计数。 String toString() 返回标识此锁存器及其状态的字符串。
用给定的计数
count 初始化 CountDownLatch
。由于调用了 countDown()
方法,所以在当前计数到达零之前,await
方法会一直受阻塞。之后,会释放所有等待的线程,await
的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier
。CountDownLatch
是一个通用同步工具,它有很多用途。将计数 1 初始化的
CountDownLatch
用作一个简单的开/关锁存器,或入口:在通过调用 countDown()
的线程打开入口前,所有调用 await
的线程都一直在入口处等待。用 N
初始化的 CountDownLatch
可以使一个线程在 N
个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。CountDownLatch
的一个有用特性是,它不要求调用 countDown
方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await,如下代码:
/** * Huisou.com Inc. * Copyright (c) 2011-2012 All Rights Reserved. */ package thread; import java.util.concurrent.CountDownLatch; /** * @description * * @author chenzehe * @email hljuczh@163.com * @create 2013-1-10 下午08:24:52 */ public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { int N = 10; CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(N); for (int i = 0; i < N; ++i) { new Thread(new Worker(startSignal, doneSignal)).start(); } Thread.sleep(2000); System.out.println("before startSignal.countDown..."); startSignal.countDown(); // let all threads proceed Thread.sleep(2000); System.out.println("finish startSignal.countDown..."); doneSignal.await(); // wait for all to finish System.out.println("wait for all to finish..."); } } class Worker implements Runnable { private final CountDownLatch startSignal; private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { this.startSignal = startSignal; this.doneSignal = doneSignal; } public void run() { try { System.out.println(Thread.currentThread().getName() + " come run method..."); startSignal.await(); doWork(); doneSignal.countDown(); System.out.println(Thread.currentThread().getName() + " left run method..."); } catch (InterruptedException ex) { } } void doWork() { System.out.println(Thread.currentThread().getName() + " do work..."); } } Thread-0 come run method... Thread-1 come run method... Thread-2 come run method... Thread-4 come run method... Thread-6 come run method... Thread-8 come run method... Thread-3 come run method... Thread-5 come run method... Thread-7 come run method... Thread-9 come run method... before startSignal.countDown... Thread-0 do work... Thread-0 left run method... Thread-1 do work... Thread-1 left run method... Thread-2 do work... Thread-2 left run method... Thread-6 do work... Thread-6 left run method... Thread-4 do work... Thread-4 left run method... Thread-8 do work... Thread-8 left run method... Thread-3 do work... Thread-3 left run method... Thread-5 do work... Thread-5 left run method... Thread-7 do work... Thread-7 left run method... Thread-9 do work... Thread-9 left run method... finish startSignal.countDown... wait for all to finish...
它不阻塞线程的方法继续执行,所以上面一直打印come run method...,但是到wait方法的时候就阻塞了,等着主线程执行startSignal.countDown();因为startSignal的值count设置为1,所以只需要执行一次就会执行do work...,此时主线程中的doneSignal.await();方法已经被阻塞,只有等到doneSignalcount为0时才往下执行,也就是在子线程中执行了N次doneSignal.countDown();方法。
发表评论
-
Java异常机制Error类和Exception类
2015-01-23 20:39 0Error类和Exception类都继承自Throwabl ... -
RPC框架简单实现
2014-11-24 21:47 1749/* * Copyright 2011 A ... -
Java读取文件中单词进行排序并写到另一个文件中
2013-12-04 11:12 5011支持 http://ifeve.com/tao-code-m ... -
Java级联调用方法的类设计
2013-11-13 14:10 3250在Java方法设计时返回当前对象的引用(thi ... -
用反射解析jar文件并执行里面Java代码
2013-10-30 23:25 115271、使用JarFile类读取jar包MANIFEST.MF ... -
Hadoop IPC RPC类中对请求的客户端缓存类ClientCache问题
2013-09-24 19:52 2334Hadoop IPC RPC类中对请求的客 ... -
Java NIO 使用实例
2013-09-23 20:47 7332在JDK1.4之前,Java Output ... -
Java 远程接口调用 RMI
2013-09-06 12:00 0Java RMI 指的是远程方法调用 (Remo ... -
Comparable Comparator 的区别
2013-09-03 14:34 1281注:本文为转载 当需要排序的集合或数组不是单纯的数字型时 ... -
Java 枚举使用实例
2013-07-01 15:30 2003Lucene Field类中使用枚举如下: 声明抽象方法 ... -
BoneCP源码——BoneCP中使用的第三方包 jsr166y、 LinkedTransferQueue队列、fork-join框架
2013-03-18 19:06 3495BoneCP主要使用了 ... -
redis 集群系统
2013-03-15 10:59 0redis 集群系统 -
BoneCP源码——BoneCP中使用的多线程
2013-03-16 17:53 39741、asyncExecutor 可缓存线程池,用于异步的创建 ... -
面试题——在一个文本里有N多个数据,使用多线程最快求和
2013-03-08 13:51 5469思路:把所有数据分组,每组使用一个线程去计算结果,计算完后 ... -
面试题——在多线程环境下如何保证一个List集合中的元素不超过15个
2013-02-22 19:16 4999这是有一次去面试被问到的,当时只知道用synchroniz ... -
阻塞队列BlockingQueue
2013-02-04 15:16 17611、队列Queue介绍 Queue是JDK1.5引入的接 ... -
Java 并发集合ConcurrentHashMap
2013-02-01 18:00 3595ConcurrentHashMap是JDK1.5并发包中提 ... -
Java 并发集合CopyOnWriteArrayList
2013-01-30 21:22 36241、Java在JDK1.5之前基本上对所有集合都实现了线程 ... -
Java集合框架 Map接口
2013-01-30 18:34 16531、HashMap HashMap是Map接口最常见的实 ... -
Java集合框架 Collection接口
2013-01-29 17:49 12271、ArrayList ArrayList是List接口 ...
相关推荐
Phaser 是一个更加灵活的同步工具类,可以用来实现复杂的同步逻辑。Phaser 可以注册多个 partiecipants,每个 partiicipant 可以在 Phaser 中注册,Phaser 会等待所有 partiicipants 都执行完毕后,再执行下一步操作...
CountDownLatch 是 Java 中一个强大的并发工具类,常用于线程间的协调与同步。它由 Java Concurrency Utilities (JCU) 包中的 `java.util.concurrent` 类库提供。CountDownLatch 的核心功能是允许一个或多个线程等待...
首先,CountDownLatch是一个同步倒数计数器,主要用于让一个或多个线程等待其他线程完成特定操作。其构造函数接受一个整数参数,表示计数器的初始值。每当调用`countDown()`方法时,计数器会递减1。`await()`方法会...
嵌入式系统开发_STM32微控制器_ESP8266WiFi模块_心率传感器_加速度计_OLED显示屏_蓝牙40_低功耗设计_实时操作系统_智能手表_多功能健康监测_运动数据记录_
驾校自动化_网页自动化爬虫技术_Python27多线程HTTP请求模拟_龙泉驾校2014版约车系统自动预约助手_通过模拟登录和循环请求实现自动约车功能_支持失败自动递增车号重试_
Linux系统编程_操作系统内核_系统调用_进程线程_信号处理_文件IO_进程间通信_多线程同步_网络编程_UNIX环境编程_中文翻译勘误_错误修正_代码示例优化_技术文档校对_开
wanjunshe_Python-Tensorflow_12888_1745868924470
scratch少儿编程逻辑思维游戏源码-铅笔画.zip
即时通讯应用开发_基于LeanCloud云服务与Android原生开发_集成QQ第三方登录与即时聊天功能的社交应用_实现用户注册登录创建聊天室发送文字消息展示用户信息头像昵称并提供
scratch少儿编程逻辑思维游戏源码-伞兵大乱斗(云变量).zip
scratch少儿编程逻辑思维游戏源码-楼层酷跑.zip
scratch少儿编程逻辑思维游戏源码-零下之寒颤.zip
scratch少儿编程逻辑思维游戏源码-密室逃生.zip
少儿编程scratch项目源代码文件案例素材-爪猫足球.zip
命令行完成git本地仓库创建、将代码提交到暂存区、查看暂存区信息、将代码提交到本地仓库、将本地仓库关联到远程仓库、推送到远程仓库全过程的截图
少儿编程scratch项目源代码文件案例素材-纸.zip
scratch少儿编程逻辑思维游戏源码-日本冒险.zip
scratch少儿编程逻辑思维游戏源码-狼人杀跑酷.zip
scratch少儿编程逻辑思维游戏源码-史莱姆杀手.zip
少儿编程scratch项目源代码文件案例素材-粘粘世界.zip