¼¹ö ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ¾²·¹µå À¯Ãâ ÇÇÇϱâ
Brian
Goetz Principal Consultant, Quiotix Corp 2002³â 9¿ù
ÁÖÀǸ¦ ±â¿ïÀÌÁö ¾ÊÀ¸¸é ¾²·¹µå´Â ¾Æ¹«·± ÈçÀûµµ ¾øÀÌ ¼¹ö
¾ÖÇø®ÄÉÀ̼ǿ¡¼ »ç¶óÁú ¼ö ÀÖ´Ù. ¾²·¹µù Àü¹®°¡ Brian Goetz´Â ¾²·¹µå ÀÌÅ» ¹æÁö ¹× °¨½Ã ±â¼úÀ»
Á¦°øÇÑ´Ù.
½Ì±Û ¾²·¹µå ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÁÖ ¾²·¹µå°¡ ÀâÈ÷Áö ¾ÊÀº ¿¹¿Ü¸¦ ´øÁú ¶§ ½ºÅà Ʈ·¹À̽º°¡ ÄÜ¼Ö»ó¿¡ ÇÁ¸°Æ® µÇ´Â
°ÍÀ» ÅëÇØ ¾Ë°Ô µÈ´Ù. ÇÏÁö¸¸ ¸ÖƼ¾²·¹µå ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ƯÈ÷ ¼¹ö·Î¼ ½ÇÇàµÇ°í Äֿܼ¡ ¾îÅÂÄ¡ µÇÁö ¾ÊÀº
¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì ¾²·¹µåÀÇ ¼Ò½ÇÀº ¾Ë·ÁÁú ¼ö ¾ø´Â À̺¥Æ®°¡ µÇ¾î ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛµ¿À» È¥µ·½ÃŰų ¼ö ÀÖ´Â
ºÎºÐÀûÀÎ ½Ã½ºÅÛ °íÀåÀ» ÀÏÀ¸Å²´Ù.
7¿ù Java theory and practice ¿¡¼, ¾²·¹µå
Ç®(thread pool)À» ´Ù·ð´Ù. ºÎÀûÀýÇÏ°Ô ÀÛ¼ºµÈ ¾²·¹µå Ç®ÀÌ ¾²·¹µå¸¦ ¾î¶»°Ô À¯Ãâ½ÃÅ°´ÂÁö¸¦ °ËÅäÇß´Ù.
´ëºÎºÐÀÇ ¾²·¹µå Ç® ±¸ÇöÀº ´øÁ®Áø ¿¹¿Ü¸¦ Àâ°í Á×Àº ¾²·¹µå¸¦ Àç½ÃÀÛÇÏ´Â °ÍÀ¸·Î À¯ÃâÀ» º¸È£ÇÏ·Á ÇÑ´Ù. ÇÏÁö¸¸
¾²·¹µå À¯ÃâÀÇ ¹®Á¦´Â ¾²·¹µå Ç®¿¡ Á¦ÇѵÇÁö ¾Ê´Â´Ù. ¼ºñ½º ÀÛ¾÷ Å¥¿¡ ¾²·¹µå¸¦ »ç¿ëÇÏ´Â ¼¹ö ¾ÖÇø®ÄÉÀ̼ǵµ
ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇÒ ¼ö ¾ø´Ù. ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¿öÄ¿(worker) ¾²·¹µå¸¦ ÀÒÀ» ¶§ ¾ÖÇø®ÄÉÀ̼ÇÀº Àá½Ãµ¿¾È
ÀÛ¾÷ÀÌ Àß ÁøÇàµÇ´Â °Í ó·³ º¸ÀÌ°Ô ÇÏ¸é¼ ¹®Á¦ÀÇ ÁøÂ¥ ¿øÀÎÀº È®ÀÎÇϱâ Èûµé°Ô ¸¸µç´Ù.
¸¹Àº ¾ÖÇø®ÄÉÀ̼ǵéÀº ¹é±×¶ó¿îµå ¼ºñ½º¸¦ Á¦°øÇÏ´Â µ¥¿¡ ¾²·¹µå¸¦ »ç¿ëÇÏ¿© ¹é±×¶ó¿îµå ¼ºñ½º¸¦ Á¦°øÇÑ´Ù.
À̺¥Æ® Å¥¿¡¼ ŽºÅ©¸¦ ÇÁ·Î¼¼½ÌÇÏ°í ¼ÒÄÏÀÇ ¸í·É¾î¸¦ Àаųª UI ¾²·¹µå ¹Û¿¡¼ Àå±â ½ÇÇà ŽºÅ©¸¦
¼öÇàÇÑ´Ù.
°¡²û¾¿ »ç¿ëÀÚµéÀº ¾î¶² Àϵµ ¹ß»ýÇÏÁö ¾Ê´Â °Í ó·³ ´À³¤´Ù. ¿¹¸¦ µé¾î ½ºÆç üŷ °°ÀÌ »ç¿ëÀÚ¿¡ ÀÇÇÑ Àå±â
¾²·¹µå ½ÇÇà ŽºÅ©¸¦ ¼öÇàÇϰųª ¿ÀÆÛ·¹ÀÌ¼Ç ¶Ç´Â ÇÁ·Î±×·¥À» ¸ØÃâ °æ¿ìÀÌ´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀº ¹é±×¶ó¿îµå ¾²·¹µå´Â
Á¤¸®ÀÛ¾÷À» ¼öÇàÇÏ°í ±×µéÀÇ ÀÇÁ¸¼º ¶§¹®¿¡ ¿À·§µ¿¾È ¾Ë ¼ö°¡ ¾ø´Ù.
¿¹Á¦ ¼¹ö
¾ÖÇø®ÄÉÀÌ¼Ç °¡»óÀÇ ¹Ìµé¿þ¾î ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀ» »ý°¢Çغ¸ÀÚ. ´Ù¾çÇÑ ÀÎDz ¼Ò½º·ÎºÎÅÍ
¸Þ½ÃÁöµéÀ» ¸ðÀ¸°í ±×µéÀ» ¿ÜºÎ ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î º¸³»°í ¿ÜºÎ ¼¹ö¿¡¼ ÀÀ´äÀ» ¹Þ¾Æ ±×°ÍÀ» ´Ù½Ã Àû´çÇÑ ÀÎDz
¼Ò½º·Î ¶ó¿ìÆÃÇÑ´Ù. °¢ ÀÎDz ¼Ò½ºÀÇ °æ¿ì °íÀ¯ÀÇ ¹æ½ÄÀ¸·Î ÀÎDz ¸Þ½ÃÁö¸¦ ¹Þ´Â Ç÷¯±×ÀÎÀÌ ÀÖ´Ù. ÆÄÀÏÀÇ µð·ºÅ丮
½ºÄ³´×, ¼ÒÄÏ ¿¬°áÀ» ±â´Ù¸®±â, µ¥ÀÌÅÍ º£À̽º µî·Ï ÀÛ¾÷À» ÇÑ´Ù. ÀÌ Ç÷¯±×ÀÎÀº JVM ¼¹ö¿¡¼ ½ÇÇàµÈ´Ù
ÇÏ´õ¶óµµ Á¦ 3ÀÚ¿¡ ÀÇÇØ ÀÛ¼ºµÈ´Ù. ÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀº Àû¾îµµ µÎ °³ÀÇ ³»ºÎ ÀÛ¾÷ Å¥¸¦ °¡Áö°í ÀÖ´Ù (Ç÷¯±×Àο¡¼
¹ÞÀº ¸Þ½ÃÁö´Â ¼¹ö·Î Àü¼ÛµÇ±â¸¦ ±â´Ù¸®°í ÀÖ°í ¼¹ö¿¡¼ ¹ÞÀº ÀÀ´äµéÀº ÀûÀýÇÑ Ç÷¯±×ÀÎÀ¸·Î Àü¼ÛµÇ±â¸¦ ±â´Ù¸°´Ù).
¸Þ½ÃÁöµéÀº ¼ºñ½º ·çƾÀÎ incomingResponse() ¸¦ Ç÷¯±×ÀÎ °´Ã¼»ó¿¡¼
È£ÃâÇÔÀ¸·Î¼ ¿ø·¡ Ç÷¯±×ÀÎÀ¸·Î ¶ó¿ìÆõȴÙ.
Ç÷¯±×Àο¡¼ ¸Þ½ÃÁö¸¦ ¹ÞÀº ÈÄ¿¡ ÀÌ ¸Þ½ÃÁöµéÀº ¾Æ¿ô°íÀ×(outgoing) ¸Þ½ÃÁö Å¥·Î ´ë±âÇÑ´Ù. ¾Æ¿ô°íÀ×
¸Þ½ÃÁö Å¥¿¡¼ ¹ÞÀº ¸Þ½ÃÁö´Â Çϳª ÀÌ»óÀÇ ¾²·¹µå·Î 󸮵ȴÙ. ÀÌ ¾²·¹µå´Â Å¥·Î ºÎÅÍ ¿Â ¸Þ½ÃÁö¸¦ ÀÐ°í ¼Ò½º¸¦
±â·ÏÇÏ°í ÀÌ°ÍÀ» ¿ø°Ý ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î º¸³½´Ù. ¿ø°Ý ¾ÖÇø®ÄÉÀ̼ÇÀº À¥ ¼ºñ½º ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÀÀ´äÇÏ°í
¼¹ö´Â ¹ÞÀº ÀÀ´äµéÀ» ÀÎÄ¿¹Ö ÀÀ´ä Å¥·Î ´ë±â½ÃŲ´Ù. Çϳª ÀÌ»óÀÇ ÀÀ´ä ¾²·¹µå´Â ÀÎÄ¿¹Ö ÀÀ´ä Å¥¿¡¼ ¸Þ½ÃÁö¸¦ Àаí
±×µéÀ» ÀûÀýÇÑ Ç÷¯±×ÀÎÀ¸·Î ¶ó¿ìÆÃÇÏ¸é¼ ¸ðµç ÇÁ·Î¼¼½º¸¦ ³¡³½´Ù.
ÀÌ ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ¿ì¸®´Â µÎ °³ÀÇ ¸Þ½ÃÁö Å¥(¾Æ¿ô°íÀ× ¿äû°ú ÀÎÄ¿¹Ö ÀÀ´ä)¸¦ °¡Áö°Ô µÈ´Ù. ±×¸®°í ¾Æ¸¶µµ
´Ù¾çÇÑ Ç÷¯±×ÀÎ ¾È¿¡´Â Ãß°¡ Å¥ µéµµ ÀÖÀ» °ÍÀÌ´Ù. ¿ì¸®´Â ¶ÇÇÑ ¿©·¯°¡ÁöÀÇ ¼ºñ½º ¾²·¹µå¸¦ °¡Áö°í Àִµ¥
¾Æ¿ô°íÀ× ¸Þ½ÃÁö Å¥¿¡¼ ¿äûÀ» ÀÐ¾î ±×µéÀ» ¿ÜºÎ ¼¹ö·Î º¸³»´Â ¾²·¹µå¿Í ÀÎÄ¿¹Ö ÀÀ´ä Å¥¿¡¼ ÀÀ´äÀ» ÀÐ¾î ±×µéÀ»
Ç÷¯±×ÀÎÀ¸·Î ¶ó¿ìÆÃÇÏ´Â ¾²·¹µå°¡ ÀÖ´Ù.
¾²·¹µå ¼Ò½ÇÀÌ ¸í¹éÇÏÁö
¾Ê´Ù! ÀÌµé ¾²·¹µå Áß ÀÀ´äÀ» º¸³»´Â ¾²·¹µå°¡ »ç¶óÁø´Ù¸é? Ç÷¯±×ÀÎÀÌ »õ·Î¿î ¸Þ½ÃÁö¸¦
º¸³¾ ¼ö Àֱ⠶§¹®¿¡ À߸øµÇ°í ÀÖ´Ù´Â »ç½ÇÀ» Áï½Ã ÀνÄÇÏÁö ¸øÇÑ´Ù. ¸Þ½ÃÁöµéÀº ´Ù¾çÇÑ ÀÎDz ¼Ò½º¸¦ ÅëÇØ µµÂøÇÏ°í
¶ÇÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ÅëÇØ ¿ÜºÎ ¼¹ö·Î º¸³»Áø´Ù. Ç÷¯±×ÀÎÀÌ ÀÀ´äÀ» Áï½Ã ±â´ëÇÏ°í ÀÖÁö ¾Ê±â ¶§¹®¿¡ ¹®Á¦°¡ ÀÖ´Ù´Â
°Í ¿ª½Ã ¾Ë ¼ö ¾ø´Ù. °á±¹ ¹ÞÀº ÀÀ´äÀº ´ë±â°¡ ±æ¾îÁö°Ô µÈ´Ù. ±×µéÀÌ ¸Þ¸ð¸®¿¡ ÀúÀåµÇ¾î ÀÖ´Ù¸é ¸Þ¸ð¸®´Â ¼ÒÁøµÉ
°ÍÀÌ´Ù. ±×·¸Áö ¾Ê´õ¶óµµ ¾î´À ½ÃÁ¡¿¡¼ ´©±º°¡°¡ ÀÀ´äÀÌ Àü¼ÛµÇÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ÀνÄÇÏ°ÚÁö¸¸ ¿À·£ ½Ã°£ÀÌ Áö³
´ÙÀ½ÀÌ´Ù. ¿Ö³ÄÇÏ¸é ½Ã½ºÅÛÀÇ ´Ù¸¥ Ãø¸éµéÀº Á¤»óÀûÀ¸·Î ÀÛµ¿Çϱ⠶§¹®ÀÌ´Ù.
ÁÖ Å½ºÅ© Çڵ鸵 Ãø¸éÀÌ ½Ì±Û ¾²·¹µå°¡ ¾Æ´Ñ ¾²·¹µå Ç®·Î ÇÚµé µÉ ¶§ °©ÀÛ½º·¯¿î ¾²·¹µå À¯Ãâ °á°ú¿¡ ´ëÇØ
¾î´À Á¤µµ È®½ÇÇÑ º¸ÀåÀÌ ÀÖ´Ù. ¿©´ü °³ÀÇ ¾²·¹µå·Î Àß ¼öÇàµÇ´Â ¾²·¹µå Ç®Àº ÀÏ°ö °³·Îµµ ÀÛ¾÷À» ¼öÇàÇÒ °ÍÀ̱â
¶§¹®ÀÌ´Ù. ¿ì¼± ÀνÄÇÒ ¼ö ÀÖ´Â Â÷ÀÌÁ¡ÀÌ ¾ø´Ù. °á±¹ ¹Ì¹¦ÇÑ ¹æ½ÄÀ¸·Î ½Ã½ºÅÛ ÆÛÆ÷¸Õ½º´Â ¶³¾îÁø´Ù.
¼¹ö ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ¾²·¹µå À¯Ãâ ¹®Á¦´Â ¿ÜºÎ¿¡¼´Â ½±°Ô °¨ÁöµÉ ¼ö ÀÖ´Â °ÍÀÌ ¾Æ´Ï´Ù. ´ëºÎºÐÀÇ ¾²·¹µå´Â
¼¹ö ¿öÅ©·ÎµåÀÇ ¾î´À ÇÑ ºÎºÐ¸¸À» ÇÚµéÇϰųª ƯÁ¤ À¯ÇüÀÇ ¹é±×¶ó¿îµå ŽºÅ©¸¦ ÇÚµéÇϱ⠶§¹®¿¡ ½É°¢ÇÑ ¿À·ù¿¡ óÇØ
ÀÖ´õ¶óµµ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ¿¡°Ô ±â´ÉÀûÀ¸·Î ÀÌ»óÀÌ ¾ø´Â °ÍÀ¸·Î º¸ÀÏ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹®Á¦´Â ¾²·¹µå À¯ÃâÀÌ Ç×»ó
Áõ°Å¸¦ ³²±âÁö ¾Ê´Â ´Ù´Â »ç½Ç°ú ´õºÒ¾î ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛµ¿À» ¾î·Æ°Ô ¸¸µå´Â ¿äÀÎÀÌ µÈ´Ù.
RuntimeExceptionÀº¾²·¹µå ¼Ò½ÇÀÇ
¿øÀÎÀÌ µÈ´Ù! ¾²·¹µå´Â ÀâÈ÷Áö ¾Ê´Â ¿¹¿Ü³ª ¿¡·¯¸¦ ÁÙ ¶§ »ç¸®Áú ¼ö ÀÖ´Ù. ¶Ç´Â ÀüÇô
¿Ï·áµÇÁö ¾ÊÀ» I/O ÀÛµ¿À» ±â´Ù¸®°Å³ª ¾î¶² ´©±¸µµ notify() ¸¦ È£ÃâÇÏÁö ¾Ê´Â ´Ù´Â
°ÍÀ» ¸ð´ÏÅ͸µ ÇÒ ¶§ ÀÛµ¿À» ¸ØÃá´Ù. ¿¹ÃøÇÏÁö ¸øÇÑ ¾²·¹µå ¼Ò½ÇÀÇ °¡Àå ÀϹÝÀûÀÎ ¿äÀÎÀº
RuntimeException À» ´øÁú ¶§ÀÌ´Ù. ¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ǿ¡¼
RuntimeException ÀÌ ÁÖ¾îÁú ÇÑ Àå¼Ò´Â Ç÷¯±×ÀÎ °´Ã¼»ó¿¡¼
incomingResponse() ¸¦ È£ÃâÇÏ¿© Ç÷¯±×ÀÎÀ¸·Î ´Ù½Ã ÀÀ´äÀÌ ³Ñ°ÜÁö°Ô µÈ´Ù.
Ç÷¯±×ÀÎ ÄÚµå´Â Á¦ »ïÀÚ¿¡ ÀÇÇØ ÀÛ¼ºµÇ¾ú°Å³ª ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÀÛ¼ºµÈ ÈÄ¿¡ ÀÛ¼ºµÇ¾ú´Ù. µû¶ó¼ ¾ÖÇø®ÄÉÀÌ¼Ç ÀÛ¼ºÀÚ°¡
À߸øÀ» °Ë»çÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù. Ç÷¯±×ÀÎÀÌ RuntimeException ¸¦ ´øÁú ¶§
ÀÀ´ä ¼ºñ½º ¾²·¹µå°¡ Á¾·áÇÑ´Ù¸é ÀÌ°ÍÀº ¿À·ù°¡ ³óÈÄÇÑ Ç÷¯±×ÀÎÀÌ Àüü ½Ã½ºÅÛÀ» ´Ù¿î½Ãų ¼ö ÀÖ´Ù´Â °ÍÀ»
ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ Ãë¾àÁ¡ÀÌ ¸Å¿ì ÀϹÝÀûÀ̶ó´Â °ÍÀº ºÒÇàÇÑ ÀÏÀÌ´Ù.
üũµÈ ¿¹¿Ü¿¡ ´ëÇØ Àû±ØÀûÀ¸·Î ÄÚµùÇÏ°ÚÁö¸¸ üũµÇÁö ¾ÊÀº ¿¹¿Ü´Â ÀÚ¹Ù °³¹ßÀڵ鿡 ÀÇÇØ ¹«½Ã´çÇÒ °ÍÀÌ´Ù.
½Ì±Û ¾²·¹µå ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ÇÚµéµÇÁö ¾ÊÀº RuntimeException ÀÇ °á°ú´Â
¸íÈ®ÇÏ´Ù. ±×¸®°í ÀÌ°ÍÀÌ ¹ß»ýÇÏ´Â °÷¿¡ ¸íÈ®ÇÑ ½ºÅà Ʈ·¹À̽º°¡ ÀÖ´Ù. ÀÌ´Â ¹®Á¦¸¦ ¾Ë·ÁÁÙ »Ó´õ·¯ À̸¦ ÇØ°áÇÒ
À¯¿ëÇÑ Á¤º¸µµ Á¦°øÇÑ´Ù. ÇÏÁö¸¸ ¸ÖƼ¾²·¹µå ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ¾²·¹µå´Â üũµÇÁö ¾ÊÀº ¿¹¿Ü ¶§¹®¿¡ Á¶¿ëÈ÷ ¾ø¾îÁø´Ù.
»ç¿ëÀÚµé°ú °³¹ßÀÚµéÀº ±× ¿øÀκÎÅÍ Ã£¾Æ¾ß ÇÑ´Ù.
¿ì¸®ÀÇ ¿¹Á¦ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¿äû/ÀÀ´ä Çڵ鷯 ¾²·¹µå °°Àº ŽºÅ© ÇÁ·Î¼¼½Ì ¾²·¹µå´Â ±âº»ÀûÀ¸·Î °ÅÀÇ ¸ðµç
½Ã°£À» Runnable °°Àº Ãß»ó ¹è¸®¾î¸¦ ÅëÇØ ¼ºñ½º ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. Ãß»ó ¹è¸®¾îÀÇ
´Ù¸¥ ºÎºÐ¿¡ ¾î¶² °ÍÀÌ ÀÖ´ÂÁö ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ ¼ºñ½º ·çƾÀÌ
RuntimeException À» ´øÁö¸é È£Ãâ ¾²·¹µå´Â ÀÌ°ÍÀ» ã¾Æ ±â·ÏÇÏ°í Å¥ÀÇ ´ÙÀ½
¾ÆÀÌÅÛÀ¸·Î ¿Å±â°Å³ª ¾²·¹µå¸¦ ´Ù¿î½ÃÅ°°í À̸¦ Àç½ÃÀÛÇÑ´Ù.
Listing 1ÀÇ ÄÚµå´Â ÀÛ¾÷ Å¥¿¡¼ Runnable ŽºÅ©¸¦ ó¸®ÇÏ´Â ¾²·¹µåÀÇ
ÀüÇüÀÌ´Ù. üũµÇÁö ¾ÊÀº ¿¹¿Ü¸¦ ´øÁö´Â Ç÷¯±×ÀÎÀ» °¨½ÃÇÏÁö ¾Ê´Â´Ù.
Listing 1. RuntimeException¸¦ °¨½ÃÇÏÁö ¾Ê´Â
worker ¾²·¹µå
private class TrustingPoolWorker extends Thread {
public void run() {
IncomingResponse ir;
while (true) {
ir = (IncomingResponse) queue.getNext();
PlugIn plugIn = findPlugIn(ir.getResponseId());
if (plugIn != null)
plugIn.handleMessage(ir.getResponse());
else
log("Unknown plug-in for response " + ir.getResponseId());
}
}
}
|
ÀÌ worker ¾²·¹µå°¡ ½ÇÆп¡ ´ëÇØ ´õ¿í °ÇØÁöµµ·Ï ¸¹Àº Äڵ带 Ãß°¡ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
RuntimeException À» Àâ°í ±×·±´ÙÀ½ Á¤Á¤ ÀÛ¾÷À» ÇÔÀ¸·Î¼ Àüü ¼¹ö¿¡ Çظ¦
³¢Ä¡´Â ¾î¼³ÇÁ°Ô ÀÛ¼ºµÈ Ç÷¯±×ÀÎÀ¸·Î ºÎÅÍ º¸È£ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÀûÀýÇÑ Á¤Á¤ ÀÛ¾÷Àº ¿¡·¯¸¦ ±â·ÏÇÏ°í ´ÙÀ½
¸Þ½ÃÁö·Î À̵¿½ÃÅ°°í ÇöÀç ¾²·¹µå¸¦ Á¾·áÇÏ°í À̸¦ Àç½ÃÀÛÇϰųª ¹®Á¦¸¦ ÀÏÀ¸Å°´Â Ç÷¯±×ÀÎÀ» ¾ð·ÎµùÇÏ´Â °ÍÀÌ´Ù.
(Listing 2):
Listing 2. RuntimeExceptionÀ» °¨½ÃÇÏ´Â worker
¾²·¹µå
private class SaferPoolWorker extends Thread {
public void run() {
IncomingResponse ir;
while (true) {
ir = (IncomingResponse) queue.getNext();
PlugIn plugIn = findPlugIn(ir.getResponseId());
if (plugIn != null) {
try {
plugIn.handleMessage(ir.getResponse());
}
catch (RuntimeException e) {
// Take some sort of action;
// - log the exception and move on
// - log the exception and restart the worker thread
// - log the exception and unload the offending plug-in
}
}
else
log("Unknown plug-in for response " + ir.getResponseId());
}
}
}
|
ThreadGroupÀÌ Á¦°øÇÑ ÀâÈ÷Áö ¾ÊÀº
¿¹¿Ü Çڵ鷯 »ç¿ëÇϱâ
ThreadGroup Ŭ·¡½ºÀÇ
uncaughtException À» »ç¿ëÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.
ThreadGroup Àº ±×´ÙÁö ¸¹ÀÌ À¯¿ëÇÏÁö ¾ÊÁö¸¸
uncaughtException ±â´ÉÀÌ ¹Ýµå½Ã ÇÊ¿äÇÒ ¶§°¡ ÀÖ´Ù. Listing 3Àº
¾²·¹µå°¡ ÀâÈ÷Áö ¾ÊÀº ¿¹¿Ü·Î ¾ø¾îÁú ¶§ ThreadGroup À» »ç¿ëÇÏ¿© À̸¦ °¨ÁöÇÏ´Â
¿¹Á¦ÀÌ´Ù:
Listing 3. uncaughtExceptionÀ» »ç¿ëÇÏ¿© ¾²·¹µå ¼Ò½Ç
¾Ë¾Æ³»±â
public class ThreadGroupExample {
public static class MyThreadGroup extends ThreadGroup {
public MyThreadGroup(String s) {
super(s);
}
public void uncaughtException(Thread thread, Throwable throwable) {
System.out.println("Thread " + thread.getName()
+ " died, exception was: ");
throwable.printStackTrace();
}
}
public static ThreadGroup workerThreads =
new MyThreadGroup("Worker Threads");
public static class WorkerThread extends Thread {
public WorkerThread(String s) {
super(workerThreads, s);
}
public void run() {
throw new RuntimeException();
}
}
public static void main(String[] args) {
Thread t = new WorkerThread("Worker Thread");
t.start();
}
}
|
ÀâÈ÷Áö ¾ÊÀº ¿¹¿Ü¸¦ ÁÖ¾ú±â ¶§¹®¿¡ thread groupÀÇ ¾²·¹µå°¡ ¾ø¾îÁø´Ù¸é thread groupÀÇ
uncaughtException() ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù. ÀÌ°ÍÀº ·Î±×¿¡ ¿£Æ®¸®¸¦ ÀÛ¼ºÇÏ°í
¾²·¹µå¿Í ½Ã½ºÅÛÀ» Àç½ÃÀÛÇÏ°í ÇÊ¿äÇÒ °æ¿ì Á¤Á¤ ¹× Áø´Ü ÀÛµ¿À» ÇÑ´Ù. ¾²·¹µå°¡ ¾ø¾îÁú ¶§ ¸ðµç ¾²·¹µå°¡ ·Î±×
¸Þ½ÃÁö¸¦ ÀÛ¼ºÇÑ´Ù¸é ¹«¾ùÀÌ À߸øµÇ¾ú´ÂÁö¿¡ ´ëÇÑ ±â·ÏÀ» °®°ÔµÈ´Ù.
¿ä¾à ¾ÖÇø®ÄÉÀ̼ǿ¡¼
¾²·¹µå°¡ »ç¶óÁö°í ¾²·¹µå°¡ ÈçÀû¾øÀÌ »ç¶óÁú ¶§ È¥¶õ½º·´´Ù. ¾²·¹µå À¯ÃâÀ» ¹æÁöÇÏ´Â ÃÖ»óÀÇ ¹æ¹ýÀº ¹æÁö¿Í °¨½ÃÀÇ
Çùµ¿ÀÛ¿ëÀÌ´Ù.
Âü°íÀÚ·á
|