|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
ÀÌÀü Ŭ·¡½º ´ÙÀ½ Ŭ·¡½º | ÇÁ·¹ÀÓÀ¸·Î ÇÁ·¹ÀÓ ¾øÀÌ | |||||||||
°³¿ä: NESTED | Çʵå | »ý¼ºÀÚ | ¸Þ¼µå | »ó¼¼: Çʵå | »ý¼ºÀÚ | ¸Þ¼µå |
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¸¦ ºí·Ï ÇØÁ¦ÇÑ µÚ¿¡ ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇß´ø °Í(Àû)ÀÌ ³ªÅ¸³ª´Â °æ¿ì¿¡µµ µé¾î¸ÂÀ¾´Ï´Ù. ±¸ÇöÀº ÀÌ µ¿ÀÛÀ» ¹®¼ÈÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
¸Þ¼µå °³¿ä | |
---|---|
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¸¦ ½ÃÀÛÇÕ´Ï´Ù. |
¸Þ¼µåÀÇ »ó¼¼ |
---|
void await() throws InterruptedException
ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â
±îÁö, ÇöÀçÀÇ thread¸¦ ´ë±â½Ãŵ´Ï´Ù.
ÀÌ Condition¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇØ¹æµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 4 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
signal()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ½ÃÀÛ thread·Î¼ ¼±ÅõȴÙsignalAll()
¸Þ¼µå¸¦ È£ÃâÇÑ´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇØ, thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù¾î´À °æ¿ì¿¡¼µµ, ÀÌ ¸Þ¼µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.
ÇöÀçÀÇ thread·Î
ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇÏ´Â °æ¿ì,
InterruptedException
ÀÌ Throw µÇ¾î ÇöÀçÀÇ threadÀÇ ÀÎÅÍ·´Æ® »óŰ¡ Ŭ¸®¾î µË´Ï´Ù. ùȸ½Ã¿¡´Â ¶ôÀÌ ÇØ¹æµÇ±â Àü¿¡ ÀÎÅÍ·´Æ®ÀÇ Å×½ºÆ®°¡ ½ÇÇàµÉÁö ¾î¶³Áö´Â ÁöÁ¤µÇÁö ¾Ê½À´Ï´Ù.
±¸Çö»óÀÇ °í·Á»çÇ×
ÀÌ ¸Þ¼µåÀÇ È£Ãâ½Ã¿¡
ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ
¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. À̰ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException
µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼ÈÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
±¸ÇöÀº ½ÅÈ£¿¡ ÀÀ´äÇØ ½ÇÇàµÇ´Â º¸Åë ÀÇ ¸Þ¼µå º¹±Í¿¡ ´ëÇÑ ÀÎÅÍ·´Æ®¿¡ ±àÁ¤ÀûÀ¸·Î ÀÀ´äÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì ±¸ÇöÀº ´Ù¸¥ ´ë±â thread°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡ ½ÅÈ£°¡ ±× thread¿¡ È®½ÇÈ÷ ¸®´ÙÀÌ·ºÆ® µÇµµ·Ï ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù) °æ¿ìvoid awaitUninterruptibly()
ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇØ¹æµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 3 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
signal()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ½ÃÀÛ thread·Î¼ ¼±ÅõȴÙsignalAll()
¸Þ¼µå¸¦ È£ÃâÇÑ´Ù¾î´À °æ¿ì¿¡¼µµ, ÀÌ ¸Þ¼µå°¡ ÇöÀçÀÇ thread¸¦ µ¹·ÁÁÖ±â Àü¿¡ ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀ» ÀçÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. threadÀÇ º¹±Í½Ã¿¡ ÀÌ ¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀÌ º¸ÁõµË´Ï´Ù.
ÇöÀçÀÇ thread°¡ ÀÌ ¸Þ¼µå¿¡ µé¾î°¥ ¶§ ÀÎÅÍ·´Æ® »óŰ¡ ¼³Á¤µÇ´ÂÁö, ´ë±âÁß¿¡ÀÎÅÍ·´Æ®
°¡ ¹ß»ýÇÏ´Â °æ¿ì, ½ÅÈ£°¡ ¼Û½ÅµÉ ¶§±îÁö ´ë±â°¡ °è¼ÓµË´Ï´Ù. ÀÌ ¸Þ¼µå·ÎºÎÅÍÀÇ ÃÖÁ¾ º¹±Í½Ã¿¡µµ, ¡¸ÀÎÅÍ·´Æ® »óÅ¡¹´Â °è¼Ó ¼³Á¤µË´Ï´Ù.
±¸Çö»óÀÇ °í·Á»çÇ×
ÀÌ ¸Þ¼µåÀÇ È£Ãâ½Ã¿¡
ÇöÀçÀÇ thread´Â ÀÌ Condition¿¡ °ü·ÃµÈ
¶ôÀ» º¸°ü À¯ÁöÇÏ´Â °ÍÀ̶ó°í º¸¿©Áý´Ï´Ù. À̰ÍÀÌ ÀÀ´ä ¹æ¹ýÀ» °áÁ¤ÇÏ´Â ¿äÀÎÀÌ µÉÁö ¾î¶³Áö´Â ±¸Çö¿¡ µû¶ó¼ ´Ù¸¨´Ï´Ù. º¸Åë, (IllegalMonitorStateException
µîÀÇ) ¿¹¿Ü°¡ Throw µÇ¾î ±¸ÇöÀº ±×°ÍÀ» ¹®¼ÈÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
long awaitNanos(long nanosTimeout) throws InterruptedException
ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇØ¹æµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 5 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
signal()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ½ÃÀÛ thread·Î¼ ¼±ÅõȴÙsignalAll()
¸Þ¼µå¸¦ È£ÃâÇÑ´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇØ, thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù¾î´À °æ¿ì¿¡¼µµ, ÀÌ ¸Þ¼µå°¡ ÇöÀçÀÇ 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
- ³ª³ëÃÊ´ÜÀ§ÀÇ ´ë±â ½Ã°£
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù) °æ¿ìboolean await(long time, TimeUnit unit) throws InterruptedException
awaitNanos(unit.toNanos(time)) > 0
time
- ´ë±âÇÏ´Â ÃÖÀå ½Ã°£unit
- time ÀμöÀÇ ½Ã°£ ´ÜÀ§
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù) °æ¿ìboolean awaitUntil(Date deadline) throws InterruptedException
ÀÌ »óÅ¿¡ °ü·ÃµÈ ¶ôÀº ¿øÀÚÀûÀ¸·Î ÇØ¹æµË´Ï´Ù. ¶Ç, ÇöÀçÀÇ thread´Â threadÀÇ ½ºÄÉÁÙ¸µÀ¸·Î¼´Â ¹«È¿°¡ µÇ¾î, ´ÙÀ½ÀÇ 5 °³Áß ÇÑÂÊÀÌ ÀϾ ¶§±îÁö ´ë±âÇÕ´Ï´Ù.
signal()
¸Þ¼µå¸¦ È£ÃâÇØ, ÇöÀçÀÇ thread°¡ ½ÃÀÛ thread·Î¼ ¼±ÅõȴÙsignalAll()
¸Þ¼µå¸¦ È£ÃâÇÑ´ÙÀÎÅÍ·´Æ®
¸¦ ½Ç½ÃÇØ, thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù¾î´À °æ¿ì¿¡¼µµ, ÀÌ ¸Þ¼µå°¡ ÇöÀçÀÇ 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
- ´ë±âÇÏ´Â Àý´ë ½Ã°£
InterruptedException
- ÇöÀçÀÇ thread·Î ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ´Â ( ¹× thread Áß´ÜÀÇ ÀÎÅÍ·´Æ®°¡ Áö¿ø
µÈ´Ù) °æ¿ìvoid signal()
ÀÌ »óÅ·Π´ë±âÁßÀÇ thread°¡ Á¸ÀçÇÏ´Â °æ¿ì, 1°³ÀÇ thread°¡ ½ÃÀÛ¿ëÀ¸·Î ¼±Åõ˴ϴÙ. ÀÌ thread´Â await·Î ºÎÅÍ º¹±ÍÇϱâ Àü¿¡ ¶ôÀ» ÀçÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
void signalAll()
ÀÌ »óÅ·Π´ë±âÁßÀÇ thread°¡ Á¸ÀçÇÏ´Â °æ¿ì, ¸ðµç thread°¡ ½ÃÀ۵˴ϴÙ. °¢ thread´Â await·Î ºÎÅÍ º¹±ÍÇϱâ Àü¿¡ ¶ôÀ» ÀçÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
ÀÌÀü Ŭ·¡½º ´ÙÀ½ Ŭ·¡½º | ÇÁ·¹ÀÓÀ¸·Î ÇÁ·¹ÀÓ ¾øÀÌ | |||||||||
°³¿ä: NESTED | Çʵå | »ý¼ºÀÚ | ¸Þ¼µå | »ó¼¼: Çʵå | »ý¼ºÀÚ | ¸Þ¼µå |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy µµ ÂüÁ¶ÇϽʽÿÀ.