javatm platform
standard ed. 6

java.util.concurrent
类 countdownlatch

java.lang.object 继承者 java.util.concurrent.countdownlatch

public class countdownlatch
extends object

一个同步辅助类,在完成一组正在其他【other】线程中执行的操作之前,它允许【yǔn xǔ】一个或多个线程一直等待。

用给定的计数 初始化 countdownlatch。由于【Meanwhile】调用了 countdown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有【all】等待的线程,await 的所有后续调用都将立即返回。这种现象只出现【There】一次——计数无法【to be】被重置。如果需要重置计数,请考虑使用 cyclicbarrier

countdownlatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 countdownlatch 用作一个简单的开/关锁存器,或入口:在通过调用 countdown() 的线程打开入口前,所有调用 awaitjs随机数 的线程都一直在入口处等待。用 n 初始化的 countdownlatch 可以【can】使一个线程在 n 个线程完成某项操作之前一直等待,或者使其在某项操作完成 n 次之前一直等待。

countdownlatch 的一个有用特性是,它不要【压嘛碟】求调用 countdown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await

示例用法: 下面给出了两个类,其中一组 worker 线程使用了两个倒计数锁存器:

 class driver { // ...  void main() throws interruptedexception { countdownlatch startsignal=new countdownlatch(1); countdownlatch donesignal=new countdownlatch(n); for (int i=0; i < n; ++i) // create and start threads  new thread(new worker(startsignal, donesignal)).start(); dosomethingelse();  // don't let run yet startsignal.countdown(); // let all threads proceed dosomethingelse(); donesignal.await();  // 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 {  startsignal.await();  dowork();  donesignal.countdown();} catch (interruptedexception ex) {} // return;  }  void dowork() { ... } } 

另一种典型用法是,将一个问题【wèn tí】分成 n 个部分,用执行每个部分并让锁存器倒计数的 runnable 来描述每个部分,然后将所有 runnable 加入到 executor 队列。当所有的子部分完成后,协调线程就能够通过 await。(当线程必须用这种方法反复倒计数时,可改为使用 cyclicbarrier。)

 class driver2 { // ...  void main() throws interruptedexception { countdownlatch donesignal=new countdownlatch(n); executor e=... for (int i=0; i < n; ++i) // create and start threads  e.execute(new workerrunnable(donesignal, i)); donesignal.await();  // wait for all to finish  } } class workerrunnable implements runnable {  private final countdownlatch donesignal;  private final int i;  workerrunnable(countdownlatch donesignal, int i) { this.donesignal=donesignal; this.i=i;  }  public void run() { try {  dowork(i);  donesignal.countdown(); } catch (interruptedexception ex) {} // return;  }  void dowork() { ... } } 

内存一致性效果:线程中调用 countdown() 之前的操作 happen-before 紧跟在从另一个线程中对应 await() 成功【chéng gōng】返回的操作。

从以下版本开始【kāi shǐ】:
1.5

构造方法摘要
countdownlatch(int count)
          构造一个用给定计数初始化的 countdownlatch
 
方法摘要
 voidawait()
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
 booleanawait(long timeout,timeunit unit)
          使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
 voidcountdown()
          递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
 longgetcount()
          返回当前计数。
 stringtostring()
          返回标识此锁存器及其状态的字符串。
 
从类 java.lang.object 继承的方法
clone, equals, finalize, getclass, hashcode, notify, notifyall, wait
据意大利《欧洲华人报》报导,Ismu(多民族活动与研究)基金会公布的第13期有关移民的报告显示,到2007年底时,意大利境内的移民共有400万,合法移民人数猛增,非法移民人数创历史【lì shǐ】最低纪录。
2月3日,米兰华人社团组织舞龙舞狮表演队以及秧歌、腰鼓表演队举行规模盛大的巡游表演。
此后华商协会也积极与市政部门沟通,做了不少努力,但提起巴黎第11区的服装街,许多【xǔ duō】华商心头的阴影仍难以抹去。
在中国【zhōng guó】传统节日春节【Chinese New Year】即将【is about】来临之际,法国总统【President】萨科齐通过1月26日发行的《欧洲时报》向生活在法国的华侨华人祝贺新春。
整个巡游表演一致在喜庆的气氛中进行,而且【but】天公也作美——一改连日来的霪雨霏霏,变得阴而无雨。
“专家”认定是假钞,随即保安报警。
中国【zhōng guó】驻瑞典大使吕凤鼎参加了庆祝活动。
主人称,现在正和员警查看现场,到底损失了多少还不知道【zhī dao】。
, wait, wait
 

构造方法详细小緂ǎn】畔

countdownlatch

public countdownlatch(int count)
构造一个用给定计数初始化的 countdownlatch

参数:
count - 在线程能通过 await() 之前,必须调用 countdown() 的次数
抛出:
illegalargumentexception - 如果 count 为负
方法详细信息

await

public void await()  throws interruptedexception
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断

如果当前计数为零,则此方法立即返回。

如果当前计数大于零,则出于线程调度【attitudes】目的,将禁用当前线程,且在发生【occasionally occurred】以下两种情况之一前,该线程将一直处于休眠状态:

如果当前线程:

则抛出 interruptedexception,并且清除当前线程的已中断状态。

抛出:
interruptedexception - 如果当前线程在等待时被中断

await

public boolean await(long timeout,     timeunit unit)   throws interruptedexception
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。

如果当前计数为零,则此方法立刻【gogo】返回 true 值。

如果当前计数大于零,则出于线程调度【attitudes】目的,将禁用当前线程,且在发生【occasionally occurred】以下三种情况之一前,该线程将一直处于休眠状态:

如果计数到达零,则该方法返回 true 值。

如果当前线程:

则抛出 interruptedexception,并且清除当前线程的已中断状态。

如果超出了指定的等待时间,则返回值为 false。如果该时间小于等于零,则此方法根本不会等待。

参数:
timeout - 要等待的最长时间
unit - timeout 参数的时间单位。
返回:
如果计数到达零,则返回 true;如果在计数到达零之前超过了等待时间,则返回 false
抛出:
interruptedexception - 如果当前线程在等待时被中断

countdown

public void countdown()
递减锁存器的计数,如果计数到达零,则释放所有等待的线程。

如果当前计数大于零,则将计数减少。如果新的计数为零,出于线程调度目的,将重新启用所有的等待线程。

如果当前计数等于零,则不发生任何操作。


getcount

public long getcountjs随机数()
返回当前计数。

此方法通常用于调试和测试。

返回:
当前计数

tostring

public string tostring()
返回标识此锁存器及其状态的字符串。状态用括号括起来,包括【bāo kuò】字符串 "count=",后跟当前计数。

覆盖:
object 中的 tostring
返回:
标识此锁存器及其状态的字符串网站地图 手机端

javatm platform
standard ed. 6

提交错误或意见【remark】
有关更多的 api 参考资料和开发【kāi fā】人员文档,请参阅 java se 开发【kāi fā】人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作【work】代码示例。

版权所有 2007 sun microsystems, inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策