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°³ÀÇ Ä«¿îÆ®´Ù¿î ºøÀåÀ» »ç¿ëÇÕ´Ï´Ù.
- ÃÖÃÊÀÇ Å¬·¡½º´Â µå¶óÀ̹öÀÇ ÁøÇà Áغñ¸¦ ÇÒ ¼ö ÀÖÀ» ¶§±îÁö, ¿öÄ«°¡ ¸ÕÀú ÁøÇàµÇ´Â °ÍÀ» ¸·´Â °³½Ã ½ÅÈ£ÀÌ´Ù
- 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¸¯ÅÍ ¶óÀÎÀ» ¸®ÅÏÇÕ´Ï´Ù. |
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¸¯ÅÍ ¶óÀÎ
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy µµ
ÂüÁ¶ÇϽʽÿÀ.