µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Java רÌâ ¡ú JavaÏß³ÌÄ£ÐÍȱÏÝÑо¿
JavaÏß³ÌÄ£ÐÍȱÏÝÑо¿
ÕªÒª: JavaµÄÏß³ÌÄ£ÐÍËüÍêÈ«²»ÊʺÏʵ¼Ê¸´ÔÓ³ÌÐòµÄÒªÇ󣬶øÇÒÒ²²»ÊÇÃæÏò¶ÔÏóµÄ
¡¡¡¡Java ±à³ÌÓïÑÔµÄÏß³ÌÄ£ÐÍ¿ÉÄÜÊÇ´ËÓïÑÔÖÐ×ÈõµÄ²¿·Ö¡£ËüÍêÈ«²»ÊʺÏʵ¼Ê¸´ÔÓ³ÌÐòµÄÒªÇ󣬶øÇÒÒ²ÍêÈ«²»ÊÇÃæÏò¶ÔÏóµÄ¡£±¾ÎĽ¨Òé¶Ô Java ÓïÑÔ½øÐÐÖØ´óÐ޸ĺͲ¹³ä£¬ÒÔ½â¾öÕâЩÎÊÌâ¡£
¡¡¡¡Java ÓïÑÔµÄÏß³ÌÄ£ÐÍÊÇ´ËÓïÑÔµÄÒ»¸ö×îÄÑÁíÈËÂúÒâµÄ²¿·Ö¡£¾¡¹Ü Java ÓïÑÔ±¾Éí¾ÍÖ§³ÖÏ̱߳à³ÌÊǼþºÃÊ£¬µ«ÊÇËü¶ÔÏ̵߳ÄÓï·¨ºÍÀà°üµÄÖ§³ÖÌ«ÉÙ£¬Ö»ÄÜÊÊÓÃÓÚ¼«Ð¡Ð͵ÄÓ¦Óû·¾³¡£
¡¡¡¡¹ØÓÚ Java Ï̱߳à³ÌµÄ´ó¶àÊýÊé¼®¶¼³¤ÆªÀÛë¹µØÖ¸³öÁË Java Ïß³ÌÄ£Ð͵ÄȱÏÝ£¬²¢ÌṩÁ˽â¾öÕâЩÎÊÌâµÄ¼±¾È°ü(Band-Aid/°îµÏ´´¿ÉÌù)Àà¿â¡£ÎÒ³ÆÕâЩÀàΪ¼±¾È°ü£¬ÊÇÒòΪËüÃÇËùÄܽâ¾öµÄÎÊÌâ±¾Ó¦ÊÇÓÉ Java ÓïÑÔ±¾ÉíÓï·¨Ëù°üº¬µÄ¡£´Ó³¤Ô¶À´¿´£¬ÒÔÓï·¨¶ø²»ÊÇÀà¿â·½·¨£¬½«ÄܲúÉú¸ü¸ßЧµÄ´úÂë¡£ÕâÊÇÒòΪ±àÒëÆ÷ºÍ Java ÐéÄâÆ÷ (JVM) ÄÜһͬÓÅ»¯³ÌÐò´úÂ룬¶øÕâЩÓÅ»¯¶ÔÓÚÀà¿âÖеĴúÂëÊǺÜÄÑ»òÎÞ·¨ÊµÏֵġ£
¡¡¡¡Allen Holub Ö¸³ö£¬ÔÚÎҵġ¶Taming Java Threads ¡·£¨Çë²ÎÔÄ ²Î¿¼×ÊÁÏ £©ÊéÖÐÒÔ¼°±¾ÎÄÖУ¬ÎÒ½øÒ»²½½¨Òé¶Ô Java ±à³ÌÓïÑÔ±¾Éí½øÐÐһЩÐ޸ģ¬ÒÔʹµÃËüÄܹ»ÕæÕý½â¾öÕâЩÏ̱߳à³ÌµÄÎÊÌâ¡£±¾ÎĺÍÎÒÕâ±¾ÊéµÄÖ÷񻂿±ðÊÇ£¬ÎÒÔÚ׫д±¾ÎÄʱ½øÐÐÁ˸ü¶àµÄ˼¿¼, ËùÒÔ¶ÔÊéÖеÄÌáÒé¼ÓÒÔÁËÌá¸ß¡£ÕâЩ½¨ÒéÖ»Êdz¢ÊÔÐ﵀ -- Ö»ÊÇÎÒ¸öÈ˶ÔÕâЩÎÊÌâµÄÏë·¨£¬¶øÇÒʵÏÖÕâЩÏë·¨ÐèÒª½øÐдóÁ¿µÄ¹¤×÷ÒÔ¼°Í¬ÐÐÃÇµÄÆÀ¼Û¡£µ«ÕâÊDZϾ¹ÊÇÒ»¸ö¿ª¶Ë£¬ÎÒÓÐÒâΪ½â¾öÕâЩÎÊÌâ³ÉÁ¢Ò»¸öרÃŵŤ×÷×飬Èç¹ûÄú¸ÐÐËȤ£¬Çë·¢ e-mail µ½ threading@holub.com ¡£Ò»µ©ÎÒÕæÕý×ÅÊÖ½øÐУ¬ÎÒ¾Í»á¸øÄú·¢Í¨Öª¡£
¡¡¡¡ÕâÀïÌá³öµÄ½¨ÒéÊǷdz£´óµ¨µÄ¡£ÓÐЩÈ˽¨Òé¶Ô Java ÓïÑԹ淶 (JLS)£¨Çë²ÎÔIJο¼×ÊÁÏ £©½øÐÐϸ΢ºÍÉÙÁ¿µÄÐÞ¸ÄÒÔ½â¾öµ±Ç°Ä£ºýµÄ JVM ÐÐΪ£¬µ«ÊÇÎÒÈ´Ïë¶ÔÆä½øÐиüΪ³¹µ×µÄ¸Ä½ø¡£
¡¡¡¡ÔÚʵ¼Ê²Ý¸åÖУ¬ÎÒµÄÐí¶à½¨Òé°üÀ¨Îª´ËÓïÑÔÒýÈëеĹؼü×Ö¡£ËäȻͨ³£ÒªÇó²»ÒªÍ»ÆÆÒ»¸öÓïÑÔµÄÏÖÓдúÂëÊÇÕýÈ·µÄ£¬µ«ÊÇÈç¹û¸ÃÓïÑԵIJ¢²»ÊÇÒª±£³Ö²»±äÒÔÖÁÓÚ¹ýʱµÄ»°£¬Ëü¾Í±ØÐëÄÜÒýÈëеĹؼü×Ö¡£ÎªÁËʹÒýÈëµÄ¹Ø¼ü×ÖÓëÏÖÓеıêʶ·û²»²úÉú³åÍ»£¬¾¹ýϸÐÄ¿¼ÂÇ£¬ÎÒ½«Ê¹ÓÃÒ»¸ö ($) ×Ö·û£¬¶øÕâ¸ö×Ö·ûÔÚÏÖÓеıêʶ·ûÖÐÊÇ·Ç·¨µÄ¡£(ÀýÈ磬ʹÓà $task£¬¶ø²»ÊÇ task)¡£´ËʱÐèÒª±àÒëÆ÷µÄÃüÁîÐпª¹ØÌṩ֧³Ö£¬ÄÜʹÓÃÕâЩ¹Ø¼ü×ֵıäÌ壬¶ø²»ÊǺöÂÔÕâ¸öÃÀÔª·ûºÅ¡£
¡¡¡¡task£¨ÈÎÎñ£©µÄ¸ÅÄî
¡¡¡¡Java Ïß³ÌÄ£Ð͵ĸù±¾ÎÊÌâÊÇËüÍêÈ«²»ÊÇÃæÏò¶ÔÏóµÄ¡£ÃæÏò¶ÔÏó (OO) Éè¼ÆÈËÔ±¸ù±¾²»°´Ï߳̽Ƕȿ¼ÂÇÎÊÌ⣻ËûÃÇ¿¼ÂǵÄÊÇͬ²½ ÐÅÏ¢ Òì²½ ÐÅÏ¢£¨Í¬²½ÐÅÏ¢±»Á¢¼´´¦Àí -- Ö±µ
½ÐÅÏ¢´¦ÀíÍê³É²Å·µ»ØÏûÏ¢¾ä±ú£»Òì²½ÐÅÏ¢ÊÕµ½ºó½«ÔÚºǫ́´¦ÀíÒ»¶Îʱ¼ä -- ¶øÔçÔÚÐÅÏ¢´¦Àí½áÊøÇ°¾Í·µ»ØÏûÏ¢¾ä±ú£©¡£Java ±à³ÌÓïÑÔÖÐµÄ Toolkit.getImage() ·½·¨¾ÍÊÇÒì²½ÐÅÏ¢µÄÒ»¸öºÃÀý×Ó¡£ getImage() µÄÏûÏ¢¾ä±ú½«±»Á¢¼´·µ»Ø£¬¶ø²»±ØµÈµ½Õû¸öͼÏñ±»ºǫ́Ïß³ÌÈ¡»Ø¡£
¡¡¡¡ÕâÊÇÃæÏò¶ÔÏó (OO) µÄ´¦Àí·½·¨¡£µ«ÊÇ£¬ÈçǰËùÊö£¬Java µÄÏß³ÌÄ£ÐÍÊÇ·ÇÃæÏò¶ÔÏóµÄ¡£Ò»¸ö Java ±à³ÌÓïÑÔÏß³Ìʵ¼ÊÉÏÖ»ÊÇÒ»¸örun() ¹ý³Ì£¬Ëüµ÷ÓÃÁËÆäËüµÄ¹ý³Ì¡£ÔÚÕâÀï¾Í¸ù±¾Ã»ÓжÔÏó¡¢Òì²½»òͬ²½ÐÅÏ¢ÒÔ¼°ÆäËü¸ÅÄî¡£
¡¡¡¡¶ÔÓÚ´ËÎÊÌ⣬ÔÚÎÒµÄÊéÖÐÉîÈëÌÖÂÛ¹ýµÄÒ»¸ö½â¾ö·½·¨ÊÇ£¬Ê¹ÓÃÒ»¸öActive_object¡£ active ¶ÔÏóÊÇ¿ÉÒÔ½ÓÊÕÒì²½ÇëÇóµÄ¶ÔÏó£¬ËüÔÚ½ÓÊÕµ½ÇëÇóºóµÄÒ»¶Îʱ¼äÄÚÒÔºǫ́·½Ê½µÃÒÔ´¦Àí¡£ÔÚ Java ±à³ÌÓïÑÔÖУ¬Ò»¸öÇëÇó¿É±»·â×°ÔÚÒ»¸ö¶ÔÏóÖС£ÀýÈ磬Äã¿ÉÒÔ°ÑÒ»¸öͨ¹ý Runnable ½Ó¿ÚʵÏÖµÄʵÀý´«Ë͸ø´Ë active ¶ÔÏó£¬¸Ã½Ó¿ÚµÄ run() ·½·¨·â×°ÁËÐèÒªÍê³ÉµÄ¹¤×÷¡£¸Ã runnable ¶ÔÏó±»´Ë active ¶ÔÏóÅÅÈëµ½¶ÓÁÐÖУ¬µ±ÂÖµ½ËüÖ´ÐÐʱ£¬active ¶ÔÏóʹÓÃÒ»¸öºǫ́Ïß³ÌÀ´Ö´ÐÐËü¡£
¡¡¡¡ÔÚÒ»¸ö active ¶ÔÏóÉÏÔËÐеÄÒì²½ÐÅϢʵ¼ÊÉÏÊÇͬ²½µÄ£¬ÒòΪËüÃDZ»Ò»¸öµ¥Ò»µÄ·þÎñḬ̈߳´Ë³Ðò´Ó¶ÓÁÐÖÐÈ¡³ö²¢Ö´ÐС£Òò´Ë£¬Ê¹ÓÃÒ»¸ö active ¶ÔÏóÒÔÒ»ÖÖ¸üΪ¹ý³Ì»¯µÄÄ£ÐÍ¿ÉÒÔÏû³ý´ó¶àÊýµÄͬ²½ÎÊÌâ¡£
¡¡¡¡ÔÚijÖÖÒâÒåÉÏ£¬Java ±à³ÌÓïÑÔµÄÕû¸ö Swing/AWT ×ÓϵͳÊÇÒ»¸ö active ¶ÔÏó¡£ÏòÒ»¸ö Swing ¶ÓÁд«ËÍÒ»ÌõѶϢµÄΨһ°²È«µÄ;¾¶ÊÇ£¬µ÷ÓÃÒ»¸öÀàËÆSwingUtilities.invokeLater() µÄ·½·¨£¬ÕâÑù¾ÍÔÚ Swing ʼþ¶ÓÁÐÉÏ·¢ËÍÁËÒ»¸ö runnable ¶ÔÏ󣬵±ÂÖµ½ËüÖ´ÐÐʱ£¬ Swing ʼþ´¦ÀíÏ߳̽«»á´¦ÀíËü¡£
¡¡¡¡ÄÇôÎҵĵÚÒ»¸ö½¨ÒéÊÇ£¬Ïò Java ±à³ÌÓïÑÔÖмÓÈëÒ»¸ötask £¨ÈÎÎñ£©µÄ¸ÅÄ´Ó¶ø½«active ¶ÔÏ󼯳ɵ½ÓïÑÔÖС£( taskµÄ¸ÅÄîÊÇ´Ó Intel µÄ RMX ²Ù×÷ϵͳºÍ Ada ±à³ÌÓïÑÔ½è¼ø¹ýÀ´µÄ¡£´ó¶àÊýʵʱ²Ù×÷ϵͳ¶¼Ö§³ÖÀàËÆµÄ¸ÅÄî¡££©
¡¡¡¡Ò»¸öÈÎÎñÓÐÒ»¸öÄÚÖÃµÄ active ¶ÔÏó·Ö·¢³ÌÐò£¬²¢×Ô¶¯¹ÜÀíÄÇЩ´¦ÀíÒì²½ÐÅÏ¢µÄÈ«²¿»úÖÆ¡£
¡¡¡¡¶¨ÒåÒ»¸öÈÎÎñºÍ¶¨ÒåÒ»¸öÀà»ù±¾Ïàͬ£¬²»Í¬µÄÖ»ÊÇÐèÒªÔÚÈÎÎñµÄ·½·¨Ç°¼ÓÒ»¸öasynchronous ÐÞÊηûÀ´Ö¸Ê¾ active ¶ÔÏóµÄ·ÖÅä³ÌÐòÔÚºǫ́´¦ÀíÕâЩ·½·¨¡£
¡¡¡¡ËùÓеÄдÇëÇó¶¼ÓÃÒ»¸ödispatch() ¹ý³Ìµ÷Óñ»·ÅÔÚ active-object µÄÊäÈë¶ÓÁÐÖÐÅŶӡ£ÔÚºǫ́´¦ÀíÕâЩÒì²½ÐÅϢʱ³öÏÖµÄÈκÎÒì³£ (exception) ¶¼ÓÉ Exception_handler ¶ÔÏó´¦Àí£¬´Ë Exception_handler ¶ÔÏó±»´«Ë͵½ File_io_task µÄ¹¹Ô캯ÊýÖС£
¡¡¡¡Õ
âÖÖ»ùÓÚÀàµÄ´¦Àí·½·¨£¬ÆäÖ÷ÒªÎÊÌâÊÇÌ«¸´ÔÓÁË -- ¶ÔÓÚÒ»¸öÕâÑù¼òµ¥µÄ²Ù×÷£¬´úÂëÌ«ÔÓÁË¡£Ïò Java ÓïÑÔÒýÈë$task ºÍ $asynchronous ¹Ø¼ü×ֺ󣬾ͿÉÒÔ°´ÏÂÃæÕâÑùÖØÐ´ÒÔǰµÄ´úÂ룺
¡¡¡¡×¢Ò⣬Òì²½·½·¨²¢Ã»ÓÐÖ¸¶¨·µ»ØÖµ£¬ÒòΪÆä¾ä±ú½«±»Á¢¼´·µ»Ø£¬¶ø²»Óõȵ½ÇëÇóµÄ²Ù×÷´¦ÀíÍê³Éºó¡£ËùÒÔ£¬´ËʱûÓкÏÀíµÄ·µ»ØÖµ¡£¶ÔÓÚÅÉÉú³öµÄÄ£ÐÍ£¬$task ¹Ø¼ü×ÖºÍ class Ò»ÑùͬЧ£º $task ¿ÉÒÔʵÏÖ½Ó¿Ú¡¢¼Ì³ÐÀàºÍ¼Ì³ÐµÄÆäËüÈÎÎñ¡£±êÓÐ asynchronous ¹Ø¼ü×ֵķ½·¨ÓÉ $task ÔÚºǫ́´¦Àí¡£ÆäËüµÄ·½·¨½«Í¬²½ÔËÐУ¬¾ÍÏñÔÚÀàÖÐÒ»Ñù¡£
¡¡¡¡$task¹Ø¼ü×Ö¿ÉÒÔÓÃÒ»¸ö¿ÉÑ¡µÄ $error ´Ó¾äÐÞÊÎ (ÈçÉÏËùʾ)£¬Ëü±íÃ÷¶ÔÈκÎÎÞ·¨±»Òì²½·½·¨±¾Éí²¶×½µÄÒì³£½«ÓÐÒ»¸öȱʡµÄ´¦Àí³ÌÐò¡£ÎÒʹÓà $ À´´ú±í±»Å׳öµÄÒì³£¶ÔÏó¡£Èç¹ûûÓÐÖ¸¶¨ $error ´Ó¾ä£¬¾Í½«´òÓ¡³öÒ»¸öºÏÀíµÄ³ö´íÐÅÏ¢£¨ºÜ¿ÉÄÜÊǶÑÕ»¸ú×ÙÐÅÏ¢£©¡£
¡¡¡¡×¢Ò⣬Ϊȷ±£Ḭ̈߳²È«£¬Òì²½·½·¨µÄ²ÎÊý±ØÐëÊDz»±ä (immutable) µÄ¡£ÔËÐÐʱϵͳӦͨ¹ýÏà¹ØÓïÒåÀ´±£Ö¤ÕâÖÖ²»±äÐÔ£¨¼òµ¥µÄ¸´ÖÆÍ¨³£ÊDz»¹»µÄ£©¡£
¡¡¡¡ËùÓÐµÄ task ¶ÔÏó±ØÐëÖ§³ÖһЩαÐÅÏ¢ (pseudo-message)¡£
¡¡¡¡³ýÁ˳£ÓõÄÐÞÊηû£¨public µÈ)£¬ task ¹Ø¼ü×Ö»¹Ó¦½ÓÊÜÒ»¸ö $pooled(n) ÐÞÊηû£¬Ëüµ¼Ö task ʹÓÃÒ»¸öÏ̳߳أ¬¶ø²»ÊÇʹÓõ¥¸öÏß³ÌÀ´ÔËÐÐÒì²½ÇëÇó¡£ n Ö¸¶¨ÁËËùÐèÏ̳߳صĴóС£»±ØÒªÊ±£¬´ËÏ̳߳ؿÉÒÔÔö¼Ó£¬µ«Êǵ±²»ÔÙÐèÒªÏß³Ìʱ£¬ËüÓ¦¸ÃËõµ½ÔÀ´µÄ´óС¡£Î±Óò (pseudo-field) $pool_size ·µ»ØÔÚ $pooled(n) ÖÐÖ¸¶¨µÄÔʼ n ²ÎÊýÖµ¡£
¡¡¡¡ÔÚ¡¶Taming Java Threads ¡·µÄµÚ°ËÕÂÖУ¬ÎÒ¸ø³öÁËÒ»¸ö·þÎñÆ÷¶ËµÄ socket ´¦Àí³ÌÐò£¬×÷ΪÏ̳߳صÄÀý×Ó¡£ËüÊǹØÓÚʹÓÃÏ̳߳صÄÈÎÎñµÄÒ»¸öºÃÀý×Ó¡£Æä»ù±¾Ë¼Â·ÊDzúÉúÒ»¸ö¶ÀÁ¢¶ÔÏó£¬ËüµÄÈÎÎñÊÇ¼à¿ØÒ»¸ö·þÎñÆ÷¶ËµÄ socket¡£Ã¿µ±Ò»¸ö¿Í»§»úÁ¬½Óµ½·þÎñÆ÷ʱ£¬·þÎñÆ÷¶ËµÄ¶ÔÏó»á´Ó³ØÖÐץȡһ¸öÔ¤ÏÈ´´½¨µÄ˯ÃßỊ̈߳¬²¢°Ñ´ËÏß³ÌÉèÖÃΪ·þÎñÓÚ¿Í»§¶ËÁ¬½Ó¡£socket ·þÎñÆ÷»á²ú³öÒ»¸ö¶îÍâµÄ¿Í»§·þÎñỊ̈߳¬µ«Êǵ±Á¬½Ó¹Ø±Õʱ£¬ÕâЩ¶îÍâµÄÏ߳̽«±»É¾³ý¡£
¡¡¡¡Socket_server¶ÔÏóʹÓÃÒ»¸ö¶ÀÁ¢µÄºǫ́Ï̴߳¦ÀíÒì²½µÄ listen() ÇëÇó£¬Ëü·â×° socket µÄ¡°½ÓÊÜ¡±Ñ»·¡£µ±Ã¿¸ö¿Í»§¶ËÁ¬½Óʱ£¬ listen() ÇëÇóÒ»¸ö Client_handler ͨ¹ýµ÷Óà handle() À´´¦ÀíÇëÇó¡£Ã¿¸ö handle() ÇëÇóÔÚËüÃÇ×Ô¼ºµÄÏß³ÌÖÐÖ´ÐУ¨ÒòΪÕâÊÇÒ»¸ö $pooled ÈÎÎñ)¡£
¡¡¡¡×¢Ò⣬ÿ¸ö´«Ë͵½$pooled $task µÄÒì²½ÏûϢʵ¼ÊÉ϶¼Ê¹ÓÃËüÃÇ×Ô¼ºµÄÏß³ÌÀ´´¦Àí¡£µäÐÍÇé¿öÏ£¬ÓÉÓÚÒ»¸ö $pooled $task ÓÃÓÚʵÏÖÒ»¸
ö×ÔÖ÷²Ù×÷£»ËùÒÔ¶ÔÓÚ½â¾öÓë·ÃÎÊ״̬±äÁ¿ÓйصÄDZÔÚµÄͬ²½ÎÊÌ⣬×îºÃµÄ½â¾ö·½·¨ÊÇÔÚ $asynchronous ·½·¨ÖÐʹÓà this ÊÇÖ¸ÏòµÄ¶ÔÏóµÄÒ»¸ö¶ÀÓи±±¾¡£Õâ¾ÍÊÇ˵£¬µ±ÏòÒ»¸ö $pooled $task ·¢ËÍÒ»¸öÒì²½ÇëÇóʱ£¬½«Ö´ÐÐÒ»¸ö clone() ²Ù×÷£¬²¢ÇÒ´Ë·½·¨µÄ this Ö¸Õë»áÖ¸Ïò´Ë¿Ë¡¶ÔÏó¡£Ïß³ÌÖ®¼äµÄͨÐÅ¿Éͨ¹ý¶Ô static ÇøµÄͬ²½·ÃÎÊʵÏÖ¡£
¡ü·µ»ØÄ¿Â¼
ǰһƪ:
´î½¨Java×ÀÃæÓ¦ÓóÌÐòÔÐÍ(Èý)
ºóһƪ:
Java³ÌÐòÔ±ÃæÊÔÏÝÚå´óÈ«