JavaTM 2 Platform
Standard Ed. 5.0

java.util.concurrent.locks
ÀÎÅÍÆäÀ̽º Condition

¾Ë·ÁÁø ±¸Çö Ŭ·¡½º ¸ñ·Ï:
AbstractQueuedSynchronizer.ConditionObject

public interface Condition

Condition´Â Object °¨½Ã ¸Þ¼­µå (wait, notify ¹× notifyAll )¸¦ º°°³ÀÇ °´Ã¼ ·Î ºÐÇØÇØ, ±×°Íµé¿¡ ÀÓÀÇ Lock ±¸ÇöÀÇ »ç¿ëÀ» Á¶ÇÕÇØ, °´Ã¼ ¸¶´Ù º¹¼öÀÇ ´ë±â ¼¼Æ®¸¦ º¸°ü À¯ÁöÇÏ´Â È¿°ú¸¦ ºÎ¿©ÇÕ´Ï´Ù. ¿©±â¼­, Lock´Â synchronized ¸Þ¼­µå ¹× ¹®ÀåÀÇ »ç¿ëÀ» ¿Å°Ü³õ¾ÆCondition´Â Object °¨½Ã ¸Þ¼­µåÀÇ »ç¿ëÀ» ¿Å°Ü³õ½À´Ï´Ù.

»óÅ ( ¡¸»óÅ ť¡¹³ª ¡¸»óÅ º¯¼ö¡¹¶ó°íµµ ºÒ¸°´Ù)´Â ¾î´À »óÅ°¡ true°¡ µÇ¾ú´ø °Í(Àû)ÀÌ ´Ù¸¥ thread¿¡ ÀÇÇØ ÅëÁöµÉ ¶§±îÁö, thread°¡ ½ÇÇàÀ» Á¤Áö (´ë±â)ÇÏ´Â ¼ö´ÜÀ» Á¦°øÇÕ´Ï´Ù. ÀÌ °øÀ¯ »óÅ Á¤º¸¿¡ÀÇ ¾×¼¼½º´Â ´Ù¸¥ thread³»¿¡¼­ ÇàÇØÁö±â ¶§¹®¿¡ ÀÌ ¾×¼¼½º¸¦ º¸È£ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ ¶§¹®¿¡ ¾î¶°ÇÑ Çü½ÄÀÇ ¶ôÀÌ ÀÌ »óÅÂ¿Í °ü·ÃÁöÀ» ¼ö ÀÖ°í ÀÖ½À´Ï´Ù. »óÅ ´ë±âÀÇ Á¦°øÇÏ´Â ÁÖ¿ä ÇÁ·ÎÆÛƼ´Â Object.wait¿Í °°ÀÌ, °ü·ÃµÈ ¶ôÀ» ¡¸¿øÀÚÀûÀ¸·Î¡¹ÇعæÇØ, ÇöÀçÀÇ thread¸¦ Á¤Áö½ÃÅ°´Â °ÍÀÔ´Ï´Ù.

Condition ÀνºÅϽº´Â ³»ÀçÀûÀ¸·Î ¶ô¿¡ ¹ÙÀÎµå µÇ°í ÀÖ½À´Ï´Ù. ƯÁ¤ Lock ¿ëÀÇ Condition ÀνºÅϽº¸¦ ÃëµæÇϱâ À§Çؼ­ ÀνºÅϽº´Â newCondition() ¸Þ¼­µå¸¦ »ç¿ëÇÕ´Ï´Ù.

¿¹·Î¼­put ¹× take ¸Þ¼­µå¸¦ Áö¿øÇÏ´Â ¹Ù¿îµå ¹öÆÛ¸¦ º¸°ü À¯ÁöÇÏ´Â °æ¿ì¸¦ »ý°¢ÇսôÙ. ºñ¾îÀÖ´Â ¹öÆÛ¿¡ ´ëÇؼ­ take°¡ ½ÃµµµÇ¸é, Ç׸ñÀÌ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö thread°¡ ºí·Ï ÇÕ´Ï´Ù. °¡µæÇÑ »óÅÂÀÇ ¹öÆÛ¿¡ ´ëÇؼ­ put°¡ ½ÃµµµÇ¸é, °ø°£ÀÌ ÀÌ¿ë °¡´ÉÇÏ°Ô µÉ ¶§±îÁö thread°¡ ºí·Ï ÇÕ´Ï´Ù. ¹öÆÛ³»¿¡¼­ Ç׸ñ ¶Ç´Â °ø°£ÀÌ ÀÌ¿ë °¡´ÉÇÏ°Ô µÈ ½ÃÁ¡¿¡¼­ ´ÜÀÏ thread ÅëÁö¸¸ÀÇ ÃÖÀûÈ­¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï, put thread¿Í take thread¸¦ º°°³ÀÇ ´ë±â ¼¼Æ®³»¿¡¼­ ´ë±â½ÃÅ°±â·Î ÇÏ°Ú½À´Ï´Ù. ÀÌ°ÍÀº 2°³ Condition ÀνºÅϽº¸¦ »ç¿ëÇØ ´Þ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.


 class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length) 
         notFull.await();
       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   } 
 }
 
(ÀÌ ±â´ÉÀº ArrayBlockingQueue Ŭ·¡½º¿¡ ÀÇÇØ Á¦°øµÇ±â ¶§¹®¿¡ ÀÌ »ç¿ë ¿¹ÀÇ Å¬·¡½º¸¦ ±¸ÇöÇÒ ÇÊ¿ä´Â ¾ø´Ù)

Condition ±¸ÇöÀº ÅëÁö ¼ø¼­ºÎ°¡ º¸ÁõµÇ´Â °ÍÀ̳ª, ÅëÁöÀÇ ½ÇÇà½Ã¿¡ ¶ôÀ» º¸°ü À¯ÁöÇÒ ÇÊ¿ä°¡ ¾ø´Â °Í µî, Object °¨½Ã ¸Þ¼­µåÀÇ µ¿ÀÛÀ̳ª ½Ã¸àƽ½º¿Í´Â ´Ù¸¥ µ¿ÀÛÀ̳ª ½Ã¸àƽ½º¸¦ Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·± Á¾·ùÀÇ Æ¯¼ö ½Ã¸àƽ½º°¡ ±¸Çö¿¡ ÀÇÇØ Á¦°øµÇ´Â °æ¿ì´Â ±¸ÇöÀº ÀÌ·¯ÇÑ ½Ã¸àƽ½º¸¦ ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

Condition ÀνºÅϽº´Â º¸Åë ÀÇ °´Ã¼À̸ç, ±× ÀÚü¸¦ synchronized ¹®ÀÇ Å¸°ÙÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â °Í ¹× µ¶ÀÚÀûÀÎ °¨½ÃÀÇ ´ë±â ¹×ÅëÁö ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â °Í¿¡ À¯ÀÇÇØ ÁÖ¼¼¿ä. Condition ÀνºÅϽºÀÇ °¨½Ã ¶ôÀÇ Ãëµæ, ¶Ç´Â ±× °¨½Ã ¸Þ¼­µåÀÇ »ç¿ëÀº, Condition¿¡ °ü·ÃµÈ Lock Ãëµæ ¶Ç´Â´ë±â ¹×½ÅÈ£ ¼Û½Å ¸Þ¼­µåÀÇ »ç¿ë°ú´Â ƯÈ÷ °ü°è°¡ ¾ø½À´Ï´Ù. È¥¶õÀ» ÇÇÇϱ⠶§¹®¿¡ µ¶ÀÚ ±¸ÇöÀÇ ³»ºÎ¸¦ Á¦¿ÜÇØ, Condition ÀνºÅϽº¸¦ ÀÌ·¯ÇÑ ¹æ¹ý¿¡¼­´Â °áÄÚ »ç¿ëÇÏÁö ¾Ê°ÔÀÇÇØ ÁÖ¼¼¿ä.

ƯÈ÷ ¸í±âµÇ¾î ÀÖÁö ¾ÊÀº ÇÑ, ¸î°³ÀÇ ÆĶó¹ÌÅÍ¿¡ ´ëÇØ null Ä¡¸¦ °Ç³×ÁÖ¸é, NullPointerExceptionÀ» ¹ß»ý½Ãŵ´Ï´Ù.

±¸Çö»óÀÇ °í·Á»çÇ×

Condition ´ë±âÁß¿¡ º¸Åë, ±âº»À¸·Î µÇ´Â Ç÷§Æû ½Ã¸àƽ½º¿¡ÀÇ ¾çº¸·Î¼­ ¡¸¿Ü°üÀÇ ½ÃÀÛ¡¹ÀÌ Çã°¡µË´Ï´Ù. Condition´Â ·çÇÁ»ó¿¡¼­ Ç×»ó ´ë±âÇØ, ´ë±â ´ë»ó »óÅ ¿¹ÃøÀ» Å×½ºÆ®ÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®¿¡ ÀÌ°ÍÀº ´ëü·ÎÀÇ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­´Â ½ÇÁúÀûÀÎ È¿°ú´Â °ÅÀÇ ¾ø½À´Ï´Ù. ±¸ÇöÀº ¿Ü°üÀÇ ½ÃÀÛÀÇ °¡´É¼ºÀ» ÀÚÀ¯·Ó°Ô »èÁ¦ÇÒ ¼ö ÀÖ½À´Ï´Ù¸¸, ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¸Ó´Â ±×°ÍÀÌ ¹ß»ýÇØ, ·çÇÁ»ó¿¡¼­ Ç×»ó ´ë±âÇÏ´Â °Í°ú »óÁ¤ÇÏ´Â °ÍÀ» ÃßõÇÕ´Ï´Ù.

»óÅ ´ë±âÀÇ 3°³ÀÇ Çü½Ä (ÀÎÅÍ·´Æ®°¡´É, ÀÎÅÍ·´Æ® ºÒ°¡ ¹× ½Ã°¢ ÁöÁ¤)¿¡¼­´Â Ç÷§Æû¿¡¼­ÀÇ ±¸ÇöÀÇ ¿ëÀ̼º ¹× ÆÛÆ÷¸Õ½º Ư¼ºÀÌ ´Ù¸¨´Ï´Ù. ƯÈ÷, ÀÌ·¯ÇÑ ±â´ÉÀ» Á¦°øÇϸ鼭, ¼ø¼­ºÎ º¸ÁõµîÀÇ Æ¯Á¤ÀÇ ½Ã¸àƽ½º¸¦ À¯ÁöÇÏ´Â °ÍÀÌ °ï¶õÇÑ °æ¿ì°¡ ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ½ÇÁ¦ÀÇ thread Áß´Ü¿¡ ³¢¾îµå´Â ±â´ÉÀ» ¸ðµç Ç÷§Æû¿¡¼­ ±¸ÇöÇÏ´Â °ÍÀº Ç×»ó ½ÇÇà °¡´ÉÇÏ´Ù¶ó°í´Â ÇÑÁ¤ÇÏÁö ¾Ê½À´Ï´Ù.

µû¶ó¼­, ±¸ÇöÀÌ, 3°³ÀÇ ´ë±â Çü½Ä ¸ðµÎ·Î µ¿ÀÏÇÑ º¸ÁõÀ̳ª ½Ã¸àƽ½º¸¦ Á¤ÀÇÇÏ´Â °ÍÀº ¿ä±¸µÇÁö ¾Ê½À´Ï´Ù. ¶Ç, ½ÇÁ¦ÀÇ thread Áß´Ü¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¸¦ Áö¿ø ÇÒ ÇÊ¿äµµ ¾ø½À´Ï´Ù.

±¸ÇöÀº ´ë±âÁßÀÇ °¢ ¸Þ¼­µå·Î Á¦°øµÇ´Â ½Ã¸àƽ½º³ª º¸Áõ ¹× ±¸ÇöÀÌ thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®¸¦ Áö¿øÀÇÇØ ÀÌ ÀÎÅÍÆäÀ̽º·Î Á¤ÀÇµÈ ÀÎÅÍ·´Æ® ½Ã¸àƽ½º¿¡ µû¸¦ ÇÊ¿ä°¡ ÀÖ´Â °æ¿ì¸¦ ¸íÈ®ÇÏ°Ô ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

º¸Åë, ÀÎÅÍ·´Æ®´Â Ãë¼Ò¸¦ ¹ÌÇØ, ÀÎÅÍ·´Æ®ÀÇ Ã¼Å©´Â ºó¹øÇÏ°Ô ÇàÇØÁö´Â °ÍÀº ¾Æ´Ï±â ¶§¹®¿¡ ±¸ÇöÀº º¸Åë ÀÇ ¸Þ¼­µå º¹±Í¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¿¡ ±àÁ¤ÀûÀ¸·Î ÀÀ´äÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº ´Ù¸¥ ¾×¼ÇÀÌ thread¸¦ ºí·Ï ÇØÁ¦ÇÑ µÚ¿¡ ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇß´ø °Í(Àû)ÀÌ ³ªÅ¸³ª´Â °æ¿ì¿¡µµ µé¾î¸ÂÀ¾´Ï´Ù. ±¸ÇöÀº ÀÌ µ¿ÀÛÀ» ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

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

¸Þ¼­µå °³¿ä
 void await ()
          ½ÅÈ£°¡ ¼Û½ÅµÇ´ÂÁö, ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 boolean await (long time, TimeUnit  unit)
          ½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 long awaitNanos (long nanosTimeout)
          ½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 void awaitUninterruptibly ()
          ÇöÀçÀÇ thread¸¦, ½ÅÈ£°¡ º¸³»Áú ¶§±îÁö ´ë±â½Ãŵ´Ï´Ù.
 boolean awaitUntil (Date  deadline)
          ½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ±âÇÑÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
 void signal ()
          ´ë±âÁßÀÇ thread¸¦ 1°³ ½ÃÀÛÇÕ´Ï´Ù.
 void signalAll ()
          ´ë±âÁßÀÇ ¸ðµç thread¸¦ ½ÃÀÛÇÕ´Ï´Ù.
 

¸Þ¼­µåÀÇ »ó¼¼

await

void await()
           throws InterruptedException 
½ÅÈ£°¡ ¼Û½ÅµÇ´ÂÁö, ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.

ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇعæµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼­´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 4 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

¾î´À °æ¿ì¿¡¼­µµ, ÀÌ ¸Þ¼­µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.

ÇöÀçÀÇ thread·Î

InterruptedExceptionÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óÅ°¡ Ŭ¸®¾î µË´Ï´Ù. ùȸ½Ã¿¡´Â ¶ôÀÌ ÇعæµÇ±â Àü¿¡ ÀÎÅÍ·´Æ®ÀÇ Å×½ºÆ®°¡ ½ÇÇàµÉÁö ¾î¶³Áö´Â ÁöÁ¤µÇÁö ¾Ê½À´Ï´Ù.

±¸Çö»óÀÇ °í·Á»çÇ×

ÀÌ ¸Þ¼­µåÀÇ È£Ãâ½Ã¿¡ ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. ÀÌ°ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼­ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

±¸ÇöÀº ½ÅÈ£¿¡ ÀÀ´äÇØ ½ÇÇàµÇ´Â º¸Åë ÀÇ ¸Þ¼­µå º¹±Í¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¿¡ ±àÁ¤ÀûÀ¸·Î ÀÀ´äÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì ±¸ÇöÀº ´Ù¸¥ ´ë±â thread°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡ ½ÅÈ£°¡ ±× thread¿¡ È®½ÇÈ÷ ¸®´ÙÀÌ·ºÆ® µÇµµ·Ï ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

¿¹¿Ü:
InterruptedException - ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø µÈ´Ù) °æ¿ì

awaitUninterruptibly

void awaitUninterruptibly()
ÇöÀçÀÇ thread¸¦, ½ÅÈ£°¡ º¸³»Áú ¶§±îÁö ´ë±â½Ãŵ´Ï´Ù.

ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇعæµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼­´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 3 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

¾î´À °æ¿ì¿¡¼­µµ, ÀÌ ¸Þ¼­µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.

ÇöÀçÀÇ thread°¡ ÀÌ ¸Þ¼­µå¿¡ µé¾î°¥ ¶§ ÀÎÅÍ·´Æ® »óÅ°¡ ¼³Á¤µÇ´ÂÁö, ´ë±âÁß¿¡ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â °æ¿ì, ½ÅÈ£°¡ ¼Û½ÅµÉ ¶§±îÁö ´ë±â°¡ °è¼ÓµË´Ï´Ù. ÀÌ ¸Þ¼­µå·ÎºÎÅÍÀÇ ÃÖÁ¾ º¹±Í½Ã¿¡µµ, ¡¸ÀÎÅÍ·´Æ® »óÅ¡¹´Â °è¼Ó ¼³Á¤µË´Ï´Ù.

±¸Çö»óÀÇ °í·Á»çÇ×

ÀÌ ¸Þ¼­µåÀÇ È£Ãâ½Ã¿¡ ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. ÀÌ°ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼­ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.


awaitNanos

long awaitNanos(long nanosTimeout)
                throws InterruptedException 
½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.

ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇعæµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼­´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 5 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

¾î´À °æ¿ì¿¡¼­µµ, ÀÌ ¸Þ¼­µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.

ÇöÀçÀÇ thread·Î

InterruptedExceptionÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óÅ°¡ Ŭ¸®¾î µË´Ï´Ù. ùȸ½Ã¿¡´Â ¶ôÀÌ ÇعæµÇ±â Àü¿¡ ÀÎÅÍ·´Æ®ÀÇ Å×½ºÆ®°¡ ½ÇÇàµÉÁö ¾î¶³Áö´Â ÁöÁ¤µÇÁö ¾Ê½À´Ï´Ù.

ÀÌ ¸Þ¼­µå´Â º¹±Í½Ã¿¡ ÁöÁ¤µÈ ´ë±â ½Ã°£À» ³ªÅ¸³»´Â nanosTimeout Ä¡¿¡ ´ëÇÑ ³ª¸ÓÁöÀÇ ÃßÁ¤ ³ª³ëÃʼö¸¦ ¸®ÅÏÇÕ´Ï´Ù. ŸÀÓ ¾Æ¿ô ½Ã°£ÀÌ °æ°úÇÏ°í ÀÖ´Â °æ¿ì´Â Á¦·Î ¶Ç´Â Á¦·Î ¹Ì¸¸ÀÇ °ªÀ» ¸®ÅÏÇÕ´Ï´Ù. ´ë±â°¡ º¹±ÍÇصµ ´ë±â »óÅ°¡ ¿©ÀüÈ÷ º¸°ü À¯ÁöµÇÁö ¾Ê´Â °æ¿ì¿¡ ÀÌ °ªÀ» »ç¿ëÇØ, ÀçÂ÷ ´ë±âÇÒÁö ¾î¶³Áö ¹× ±× ±â°£À» °áÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. º¸Åë, ÀÌ ¸Þ¼­µå´Â ´ÙÀ½ÀÇ Çü½ÄÀÌ µË´Ï´Ù.


 synchronized boolean aMethod(long timeout, TimeUnit unit) {
   long nanosTimeout = unit.toNanos(timeout);
   while (! conditionBeingWaitedFor) {
     if (nanosTimeout > 0)
         nanosTimeout = theCondition.awaitNanos(nanosTimeout);
      else
        return false;
   }
   // ... 
 }
 

¼³°è»óÀÇ ÁÖÀÇ: ÀÌ ¸Þ¼­µå´Â ³²Àº ½Ã°£À» ¸®Æ÷Æ®ÇÒ ¶§¿¡ Àß¶ó¼­ ¹ö¸² ¿¡·¯ÀÇ ¹ß»ýÀ» ÇÇÇϱâ À§Çؼ­ ³ª³ëÃÊÀÇ Àμö¸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. ÀÌ Á¤¹Ðµµ°¡ ÀúÇÏÇϸé, ´ë±â ½Ã°£ÀÇ ÇÕ°è°¡ ÁöÁ¤µÈ Àç´ë±âÀÇ ¹ß»ý½Ãº¸´Ù ½Ã½ºÅÛÀûÀ¸·Î ªÁö ¾ÊÀº °ÍÀ» ÇÁ·Î±×·¡¸Ó°¡ º¸ÁõÇÏ´Â °ÍÀÌ ¾î·Á¿öÁý´Ï´Ù.

±¸Çö»óÀÇ °í·Á»çÇ×

ÀÌ ¸Þ¼­µåÀÇ È£Ãâ½Ã¿¡ ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. ÀÌ°ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼­ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

±¸ÇöÀº ½ÅÈ£¿¡ ÀÀ´äÇØ ½ÇÇàµÇ´Â º¸Åë ÀÇ ¸Þ¼­µå º¹±Í¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®, ¶Ç´Â ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÇ °æ°ú Áö½Ã¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¿¡ ±àÁ¤ÀûÀ¸·Î ÀÀ´äÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾î´À ÂÊÀÇ °æ¿ìµµ, ±¸ÇöÀº ´Ù¸¥ ´ë±â thread°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡ ½ÅÈ£°¡ ±× thread¿¡ È®½ÇÈ÷ ¸®´ÙÀÌ·ºÆ® µÇµµ·Ï ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

ÆĶó¹ÌÅÍ:
nanosTimeout - ³ª³ëÃÊ´ÜÀ§ÀÇ ´ë±â ½Ã°£
¹Ýȯ°ª:
´ë±â°¡ ŸÀÓ ¾Æ¿ô ÇßÀ» °æ¿ì´Â Á¦·Î ¾Æ·¡ÀÇ °ª. ±×·¸Áö ¾ÊÀº °æ¿ì´Â ÀÌ ¸Þ¼­µåÀÇ º¹±Í½ÃÀÇ ÃßÁ¤ ³²Àº ½Ã°£ (nanosTimeout Àμöº¸´Ù Ç×»ó ÀÛÀº °ªÀÌ µÈ´Ù)
¿¹¿Ü:
InterruptedException - ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø µÈ´Ù) °æ¿ì

await

boolean await(long time,
              TimeUnit  unit)
              throws InterruptedException 
½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ´ë±â ½Ã°£ÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù. ÀÌ ¸Þ¼­µåÀÇ µ¿ÀÛÀº ÀÌÇÏ¿¡ µ¿ÀÏÇØÁý´Ï´Ù.

   awaitNanos(unit.toNanos(time)) > 0
 

ÆĶó¹ÌÅÍ:
time - ´ë±âÇÏ´Â ÃÖÀå ½Ã°£
unit - time ÀμöÀÇ ½Ã°£ ´ÜÀ§
¹Ýȯ°ª:
¸Þ¼­µå·ÎºÎÅÍÀÇ º¹±ÍÀü¿¡ ´ë±â ½Ã°£ÀÌ °æ°úÇß´ø °ÍÀÌ °ËÃâµÇ¾úÀ» °æ¿ì´Â false, ±×·¸Áö ¾ÊÀº °æ¿ì´Â true
¿¹¿Ü:
InterruptedException - ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø µÈ´Ù) °æ¿ì

awaitUntil

boolean awaitUntil(Date  deadline)
                   throws InterruptedException 
½ÅÈ£°¡ ¼Û½ÅµÇ´Â ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÑ´Ù, ¶Ç´Â ÁöÁ¤µÈ ±âÇÑÀÌ °æ°úÇÒ ¶§±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.

ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇعæµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼­´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 5 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.

¾î´À °æ¿ì¿¡¼­µµ, ÀÌ ¸Þ¼­µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.

ÇöÀçÀÇ thread·Î

InterruptedExceptionÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óÅ°¡ Ŭ¸®¾î µË´Ï´Ù. ùȸ½Ã¿¡´Â ¶ôÀÌ ÇعæµÇ±â Àü¿¡ ÀÎÅÍ·´Æ®ÀÇ Å×½ºÆ®°¡ ½ÇÇàµÉÁö ¾î¶³Áö´Â ÁöÁ¤µÇÁö ¾Ê½À´Ï´Ù.

¹Ýȯ°ªÀº ±âÇÑÀÌ °æ°úÇß´ÂÁö ¾î¶°Çß´ÂÁö¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ °ªÀº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.


 synchronized boolean aMethod(Date deadline) {
   boolean stillWaiting = true;
   while (! conditionBeingWaitedFor) {
     if (stillwaiting)
         stillWaiting = theCondition.awaitUntil(deadline);
      else
        return false;
   }
   // ... 
 }
 

±¸Çö»óÀÇ °í·Á»çÇ×

ÀÌ ¸Þ¼­µåÀÇ È£Ãâ½Ã¿¡ ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. ÀÌ°ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼­ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼­È­ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

±¸ÇöÀº ½ÅÈ£¿¡ ÀÀ´äÇØ ½ÇÇàµÇ´Â º¸Åë ÀÇ ¸Þ¼­µå º¹±Í¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®, ¶Ç´Â ÁöÁ¤µÈ ±âÇÑÀÇ °æ°ú Áö½Ã¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¿¡ ±àÁ¤ÀûÀ¸·Î ÀÀ´äÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾î´À ÂÊÀÇ °æ¿ìµµ, ±¸ÇöÀº ´Ù¸¥ ´ë±â thread°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡ ½ÅÈ£°¡ ±× thread¿¡ È®½ÇÈ÷ ¸®´ÙÀÌ·ºÆ® µÇµµ·Ï ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.

ÆĶó¹ÌÅÍ:
deadline - ´ë±âÇÏ´Â Àý´ë ½Ã°£
¹Ýȯ°ª:
º¹±Í½Ã¿¡ ±âÇÑÀÌ °æ°úÇÏ°í ÀÖ´Â °æ¿ì´Â false, ±×·¸Áö ¾ÊÀº °æ¿ì´Â true
¿¹¿Ü:
InterruptedException - ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø µÈ´Ù) °æ¿ì

signal

void signal()
´ë±âÁßÀÇ thread¸¦ 1°³ ½ÃÀÛÇÕ´Ï´Ù.

ÀÌ »óÅ·Π´ë±âÁßÀÇ thread°¡ Á¸ÀçÇÏ´Â °æ¿ì, 1°³ÀÇ thread°¡ ½ÃÀÛ¿ëÀ¸·Î ¼±Åõ˴ϴÙ. ÀÌ thread´Â await·Î ºÎÅÍ º¹±ÍÇϱâ Àü¿¡ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.


signalAll

void signalAll()
´ë±âÁßÀÇ ¸ðµç thread¸¦ ½ÃÀÛÇÕ´Ï´Ù.

ÀÌ »óÅ·Π´ë±âÁßÀÇ thread°¡ Á¸ÀçÇÏ´Â °æ¿ì, ¸ðµç thread°¡ ½ÃÀ۵˴ϴÙ. °¢ thread´Â await·Î ºÎÅÍ º¹±ÍÇϱâ Àü¿¡ ¶ôÀ» ÀçÃëµæÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.


JavaTM 2 Platform
Standard Ed. 5.0

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