JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent
Ŭ·¡½º CountDownLatch

java.lang.Object 
  »óÀ§¸¦ È®Àå java.util.concurrent.CountDownLatch

public class CountDownLatch
extends Object

´Ù¸¥ thread·Î ½ÇÇàÁßÀÇ Á¶ÀÛ ¼¼Æ®°¡ ¿Ï·áÇÒ ¶§±îÁö, 1°³ ÀÌ»óÀÇ thread¸¦ ´ë±â °¡´ÉÇÏ°Ô ÇÏ´Â µ¿±â Áö¿ø.

CountDownLatch´Â ÁöÁ¤µÈ ¡¸Ä«¿îÆ®¡¹¸¦ »ç¿ëÇØ ÃʱâÈ­µË´Ï´Ù. await ¸Þ¼­µå´Â countDown() ¸Þ¼­µå È£ÃâÀÇ °á°ú·Î¼­, ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸¦ ¶§±îÁö ºí·Ï ÇÕ´Ï´Ù. ±× ÈÄ, ´ë±âÁßÀÇ thread°¡ ¸ðµÎ ÇعæµÇ¾î ÈļÓÀÇ await È£ÃâÀÌ ¸ðµÎ ¸®Åϵ˴ϴ٠. ÀÌ°ÍÀº ´Ü¹ßÀûÀÎ Çö»óÀ̸ç, Ä«¿îÆ®¸¦ ¸®¼Â ÇÒ ¼ö ¾ø½À´Ï´Ù. Ä«¿îÆ®¸¦ ¸®¼Â ÇÏ´Â ¹öÀüÀÌ ÇÊ¿äÇÑ °æ¿ì´Â CyclicBarrier »ç¿ëÀ» °í·ÁÇØ ÁÖ¼¼¿ä.

CountDownLatch´Â ´Ù¾çÇÑ ¸ñÀûÀ¸·Î »ç¿ë °¡´ÉÇÑ À¯¿¬¼ºÀÇ ³ôÀº µ¿±â ÅøÀÔ´Ï´Ù. Ä«¿îÆ® 1 À¸·Î ÃʱâÈ­µÈ CountDownLatch´Â ´Ü¼øÇÑ ¿Â/¿ÀÇÁÀÇ ºøÀå ¶Ç´Â °ÔÀÌÆ®·Î¼­ ±â´ÉÇÕ´Ï´Ù. await¸¦ È£ÃâÇÏ´Â thread´Â ¸ðµÎ, countDown()¸¦ È£ÃâÇÏ´Â thread¿¡ ÀÇÇØ ¿ÀÇ嵃 ¶§±îÁö °ÔÀÌÆ®·Î ´ë±âÇÕ´Ï´Ù. N¿¡ ÃʱâÈ­µÈ CountDownLatch¸¦ »ç¿ëÇϸé, N°³ÀÇ thread°¡ ¾×¼ÇÀ» ¿Ï·áÇÏ´ÂÁö, ¾×¼ÇÀÌ N ȸ¿Ï·áÇÒ ¶§±îÁö, ¾î´À thread¸¦ ´ë±â½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù.

CountDownLatch ÇÁ·ÎÆÛƼ·Î À¯¿ëÇÑ °ÍÀº, countDown¸¦ È£ÃâÇÏ´Â thread°¡ Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸¦ ¶§±îÁö 󸮸¦ ´ë±âÇÒ ÇÊ¿ä°¡ ¾ø´Â °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀº ¸ðµç thread°¡ ÆнºÇÒ ¶§±îÁö, ¾î´À threadµµ await¸¦ ºüÁöÁö ¾Ê°Ô ÇÒ »ÓÀÔ´Ï´Ù.

»ç¿ë¿¹: ÀÌÇÏ¿¡ ³ªÅ¸³»´Â Ŭ·¡½ºÀÇ Æä¾î¿¡¼­´Â ¿öÅ©½º ·¹µåÀÇ ±×·ìÀÌ ´ÙÀ½ÀÇ 2°³ÀÇ Ä«¿îÆ®´Ù¿î ºøÀåÀ» »ç¿ëÇÕ´Ï´Ù.


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() { ... }
}

ÀÌÁ¦(ÀÌ¹Ì ) 1°³ÀÇ Ç¥ÁØÀûÀÎ »ç¿ë¹ýÀº ¹®Á¦¸¦ N°³ÀÇ ºÎºÐ¿¡ ºÐÇÒÇØ, °¢ºÎ¸¦ ½ÇÇàÇØ ºøÀåÀ» Ä«¿îÆ®´Ù¿î ÇÏ´Â Runnable¸¦ »ç¿ëÇØ °¢ ºÎºÐÀ» ±â¼úÇØ, ¸ðµç Runnable¸¦ Executor Å¥¿¡ ³Ö´Â ¹æ¹ýÀÔ´Ï´Ù. ÇÏÀ§ ºÎºÐÀÌ ¸ðµÎ ¿Ï·áÇϸé, Á¶Á¤¿ªÀÇ thread´Â await¸¦ ºüÁú ¼ö°¡ ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î thread°¡ Ä«¿îÆ®´Ù¿îÀ» ¹Ýº¹ÇØ ½ÇÇàÇÒ ÇÊ¿ä°¡ ÀÖ´Â °æ¿ì´Â ´ë½Å¿¡ 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() { ... }
}

µµÀÔµÈ ¹öÀü :
1.5

»ý¼ºÀÚ °³¿ä
CountDownLatch (int count)
          ÁöÁ¤µÈ Ä«¿îÆ®·Î ÃʱâÈ­µÈ CountDownLatch¸¦ ±¸ÃàÇÕ´Ï´Ù.
 
¸Þ¼­µå °³¿ä
 void await ()
          thread·ÎÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏÁö ¾Ê´Â ÇÑ, ºøÀåÀÇ Ä«¿îÆ®´Ù¿îÀÌ Á¦·Î°¡ µÉ ¶§±îÁö ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 boolean await (long timeout, TimeUnit  unit)
          thread·ÎÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´ÂÁö, ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÏÁö ¾Ê´Â ÇÑ, ºøÀåÀÇ Ä«¿îÆ®´Ù¿îÀÌ Á¦·Î°¡ µÉ ¶§±îÁö ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 void countDown ()
          ºøÀåÀÇ Ä«¿îÆ®¸¦ °¨»êÇØ, Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£¸é ´ë±âÁßÀÇ thread¸¦ ¸ðµÎ ÇعæÇÕ´Ï´Ù.
 long getCount ()
          ÇöÀçÀÇ Ä«¿îÆ®¸¦ ¸®ÅÏÇÕ´Ï´Ù.
 String toString ()
          ÀÌ ºøÀå ¹× ±× »óŸ¦ ½Äº°Çϴ ij¸¯ÅÍ ¶óÀÎÀ» ¸®ÅÏÇÕ´Ï´Ù.
 
Ŭ·¡½º java.lang. Object ·ÎºÎÅÍ »ó¼ÓµÈ ¸Þ¼­µå
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

»ý¼ºÀÚ »ó¼¼

CountDownLatch

public CountDownLatch(int count)
ÁöÁ¤µÈ Ä«¿îÆ®·Î ÃʱâÈ­µÈ CountDownLatch¸¦ ±¸ÃàÇÕ´Ï´Ù.

ÆĶó¹ÌÅÍ:
count - thread°¡ await()¸¦ ºüÁö±â Àü¿¡ countDown()¸¦ È£ÃâÇϴ ȸ¼ö
¿¹¿Ü:
IllegalArgumentException - count°¡ 0 º¸´Ù ÀÛÀº °æ¿ì
¸Þ¼­µåÀÇ »ó¼¼

await

public void await()
           throws InterruptedException 
thread·ÎÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏÁö ¾Ê´Â ÇÑ, ºøÀåÀÇ Ä«¿îÆ®´Ù¿îÀÌ Á¦·Î°¡ µÉ ¶§±îÁö ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·ÎÀÇ °æ¿ì, ÀÌ ¸Þ¼­µå´Â Áï½Ã º¹±ÍÇÕ´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·Îº¸´Ù Å« °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ ´ëÇؼ­´Â ¹«È¿·Î ¿©°ÜÁ® ´ÙÀ½ÀÇ 2°³ÀÇ ¾î´À ÂÊÀÎÁö°¡ ¹ß»ýÇÒ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

  • countDown() ¸Þ¼­µåÀÇ È£Ãâ¿¡ÀÇÇØ Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸¥´Ù
  • ´Ù¸¥ thread°¡ ÇöÀçÀÇ thread¿¡ÀÎÅÍ·´Æ®¸¦ ½Ç½ÃÇÑ´Ù

ÇöÀçÀÇ thread°¡

  • ÀÌ ¸Þ¼­µå¿¡ÀÇ ¿£Æ®¸®»ó¿¡¼­ ¼³Á¤µÈ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº¸¦ º¸°ü À¯ÁöÇÏ´ÂÁö,
  • ´ë±âÁß¿¡ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedExceptionÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº°¡ Ŭ¸®¾î µË´Ï´Ù.

¿¹¿Ü:
InterruptedException - ´ë±âÁß¿¡ ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì

await

public boolean await(long timeout,
                     TimeUnit  unit)
              throws InterruptedException 
thread·ÎÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´ÂÁö, ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÏÁö ¾Ê´Â ÇÑ, ºøÀåÀÇ Ä«¿îÆ®´Ù¿îÀÌ Á¦·Î°¡ µÉ ¶§±îÁö ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·ÎÀÇ °æ¿ì, ÀÌ ¸Þ¼­µå´Â Áï½Ã °ª true·Î º¹±ÍÇÕ´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·Îº¸´Ù Å« °æ¿ì, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µ¿¡ ´ëÇؼ­´Â ¹«È¿·Î ¿©°ÜÁ® ´ÙÀ½ÀÇ 3 °³Áß ÇÑÂÊÀÌ ¹ß»ýÇÒ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

  • countDown() ¸Þ¼­µåÀÇ È£Ãâ¿¡ÀÇÇØ Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£´ÂÁö,
  • ´Ù¸¥ thread°¡ ÇöÀçÀÇ thread¿¡ÀÎÅÍ·´Æ®¸¦ ½Ç½ÃÇÏ´ÂÁö,
  • ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÑ´Ù

Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£¸é, ¸Þ¼­µå´Â °ª true·Î º¹±ÍÇÕ´Ï´Ù.

ÇöÀçÀÇ thread°¡

  • ÀÌ ¸Þ¼­µå¿¡ÀÇ ¿£Æ®¸®»ó¿¡¼­ ¼³Á¤µÈ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº¸¦ º¸°ü À¯ÁöÇÏ´ÂÁö,
  • ´ë±âÁß¿¡ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì,
InterruptedExceptionÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® ½ºÅ×ÀÌÅͽº°¡ Ŭ¸®¾î µË´Ï´Ù.

ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇϸé, °ª false°¡ ¸®Åϵ˴ϴ٠. ½Ã°£ÀÌ Á¦·Î ¶Ç´Â ±×°Íº¸´Ù ÀÛÀº °æ¿ì, ¸Þ¼­µå´Â ´ë±âÇÏÁö ¾Ê½À´Ï´Ù.

ÆĶó¹ÌÅÍ:
timeout - ´ë±âÇÏ´Â ÃÖÀå ½Ã°£
unit - timeout ÀμöÀÇ ½Ã°£ ´ÜÀ§
¹Ýȯ°ª:
Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£·¶À» °æ¿ì´Â true, Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£±â Àü¿¡ ´ë±â ½Ã°£ÀÌ °æ°úÇßÀ» °æ¿ì´Â false
¿¹¿Ü:
InterruptedException - ´ë±âÁß¿¡ ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì

countDown

public void countDown()
ºøÀåÀÇ Ä«¿îÆ®¸¦ °¨»êÇØ, Ä«¿îÆ®°¡ Á¦·Î¿¡ À̸£¸é ´ë±âÁßÀÇ thread¸¦ ¸ðµÎ ÇعæÇÕ´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·Îº¸´Ù Å« °æ¿ì, °ªÀÌ ÁÙ¿©Áý´Ï´Ù. »õ·Î¿î Ä«¿îÆ®°¡ Á¦·ÎÀÇ °æ¿ì, ´ë±âÁßÀÇ ¸ðµç threadÀÇ ½ºÄÉÁÙ¸µÀÌ ´Ù½Ã °¡´ÉÇÏ°Ô µË´Ï´Ù.

ÇöÀçÀÇ Ä«¿îÆ®°¡ Á¦·ÎÀÇ °æ¿ì, ¾Æ¹«°Íµµ ÇàÇØÁöÁö ¾Ê½À´Ï´Ù.


getCount

public long getCount()
ÇöÀçÀÇ Ä«¿îÆ®¸¦ ¸®ÅÏÇÕ´Ï´Ù.

º¸Åë, ÀÌ ¸Þ¼­µå´Â µð¹ö±× ¹× Å×½ºÆ® ¸ñÀûÀ¸·Î »ç¿ëÇÕ´Ï´Ù.

¹Ýȯ°ª:
ÇöÀçÀÇ Ä«¿îÆ®

toString

public String  toString()
ÀÌ ºøÀå ¹× ±× »óŸ¦ ½Äº°Çϴ ij¸¯ÅÍ ¶óÀÎÀ» ¸®ÅÏÇÕ´Ï´Ù. »óÅ´ °ýÈ£·Î µÑ·¯½Î¿© ij¸¯ÅÍ ¶óÀÎ ¡¸Count =¡¹¿¡ À̾î ÇöÀçÀÇ Ä«¿îÆ®°¡ ÁöÁ¤µË´Ï´Ù.

¿À¹ö¶óÀ̵å(override):
Ŭ·¡½º Object ³»ÀÇ toString
¹Ýȯ°ª:
ÀÌ ºøÀå ¹× ±× »óŸ¦ ½Äº°Çϴ ij¸¯ÅÍ ¶óÀÎ

JavaTM 2 Platform
Standard Ed. 5.0

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy µµ ÂüÁ¶ÇϽʽÿÀ.