ºìÁªLinuxÃÅ»§
Linux°ïÖú

Ï̳߳ØÓ빤×÷¶ÓÁÐ

·¢²¼Ê±¼ä:2006-05-03 19:20:03À´Ô´:ºìÁª×÷Õß:ÌìɽÀÏͯ
ÌùÔÚÎÒÃǶàÏß³Ì Java ±à³ÌÂÛ̳ÉÏ×î³£¼ûµÄÎÊÌâÖ®Ò»ÊÇ¡°ÔõÑù´´½¨Ï̳߳أ¿¡±¡£¼¸ºõÔÚÿ¸ö·þÎñÆ÷Ó¦ÓóÌÐòÖж¼»á³öÏÖÏ̳߳غ͹¤×÷¶ÓÁÐÎÊÌâ¡£±¾ÎÄÖУ¬Brian Goetz ̽ÌÖÁËÏ̳߳صĶ¯»ú¡¢Ò»Ð©»ù±¾ÊµÏֺ͵÷Óż¼ÊõÒÔ¼°Ò»Ð©Òª±ÜÃâµÄ³£¼ûΣÏÕ¡£
ΪʲôҪÓÃÏ̳߳أ¿
ÖîÈç Web ·þÎñÆ÷¡¢Êý¾Ý¿â·þÎñÆ÷¡¢Îļþ·þÎñÆ÷»òÓʼþ·þÎñÆ÷Ö®ÀàµÄÐí¶à·þÎñÆ÷Ó¦ÓóÌÐò¶¼ÃæÏò´¦ÀíÀ´×ÔijЩԶ³ÌÀ´Ô´µÄ´óÁ¿¶ÌСµÄÈÎÎñ¡£ÇëÇóÒÔijÖÖ·½Ê½µ½´ï·þÎñÆ÷£¬ÕâÖÖ·½Ê½¿ÉÄÜÊÇͨ¹ýÍøÂçЭÒ飨ÀýÈç HTTP¡¢FTP »ò POP£©¡¢Í¨¹ý JMS ¶ÓÁлòÕß¿ÉÄÜͨ¹ýÂÖѯÊý¾Ý¿â¡£²»¹ÜÇëÇóÈçºÎµ½´ï£¬·þÎñÆ÷Ó¦ÓóÌÐòÖо­³£³öÏÖµÄÇé¿öÊÇ£ºµ¥¸öÈÎÎñ´¦ÀíµÄʱ¼äºÜ¶Ì¶øÇëÇóµÄÊýÄ¿È´ÊǾ޴óµÄ¡£

¹¹½¨·þÎñÆ÷Ó¦ÓóÌÐòµÄÒ»¸ö¹ýÓÚ¼òµ¥µÄÄ£ÐÍÓ¦¸ÃÊÇ£ºÃ¿µ±Ò»¸öÇëÇóµ½´ï¾Í´´½¨Ò»¸öÐÂỊ̈߳¬È»ºóÔÚÐÂÏß³ÌÖÐΪÇëÇó·þÎñ¡£Êµ¼ÊÉÏ£¬¶ÔÓÚÔ­ÐÍ¿ª·¢ÕâÖÖ·½·¨¹¤×÷µÃºÜºÃ£¬µ«Èç¹ûÊÔͼ²¿ÊðÒÔÕâÖÖ·½Ê½ÔËÐеķþÎñÆ÷Ó¦ÓóÌÐò£¬ÄÇôÕâÖÖ·½·¨µÄÑÏÖز»×ã¾ÍºÜÃ÷ÏÔ¡£Ã¿¸öÇëÇó¶ÔÓ¦Ò»¸öỊ̈߳¨thread-per- request£©·½·¨µÄ²»×ãÖ®Ò»ÊÇ£ºÎªÃ¿¸öÇëÇó´´½¨Ò»¸öÐÂÏ̵߳ĿªÏúºÜ´ó£»ÎªÃ¿¸öÇëÇó´´½¨ÐÂÏ̵߳ķþÎñÆ÷ÔÚ´´½¨ºÍÏú»ÙÏß³ÌÉÏ»¨·ÑµÄʱ¼äºÍÏûºÄµÄϵͳ×ÊÔ´Òª±È»¨ÔÚ´¦Àíʵ¼ÊµÄÓû§ÇëÇóµÄʱ¼äºÍ×ÊÔ´¸ü¶à¡£

³ýÁË´´½¨ºÍÏú»ÙÏ̵߳ĿªÏúÖ®Í⣬»î¶¯µÄÏß³ÌÒ²ÏûºÄϵͳ×ÊÔ´¡£ÔÚÒ»¸ö JVM Àï´´½¨Ì«¶àµÄÏ߳̿ÉÄܻᵼÖÂϵͳÓÉÓÚ¹ý¶ÈÏûºÄÄÚ´æ¶øÓÃÍêÄÚ´æ»ò¡°Çл»¹ý¶È¡±¡£ÎªÁË·ÀÖ¹×ÊÔ´²»×㣬·þÎñÆ÷Ó¦ÓóÌÐòÐèҪһЩ°ì·¨À´ÏÞÖÆÈκθø¶¨Ê±¿Ì´¦ÀíµÄÇëÇóÊýÄ¿¡£

Ï̳߳ØΪÏß³ÌÉúÃüÖÜÆÚ¿ªÏúÎÊÌâºÍ×ÊÔ´²»×ãÎÊÌâÌṩÁ˽â¾ö·½°¸¡£Í¨¹ý¶Ô¶à¸öÈÎÎñÖØÓÃỊ̈߳¬Ï̴߳´½¨µÄ¿ªÏú±»·Ö̯µ½Á˶à¸öÈÎÎñÉÏ¡£ÆäºÃ´¦ÊÇ£¬ÒòΪÔÚÇëÇóµ½´ïʱÏß³ÌÒѾ­´æÔÚ£¬ËùÒÔÎÞÒâÖÐÒ²Ïû³ýÁËÏ̴߳´½¨Ëù´øÀ´µÄÑÓ³Ù¡£ÕâÑù£¬¾Í¿ÉÒÔÁ¢¼´ÎªÇëÇó·þÎñ£¬Ê¹Ó¦ÓóÌÐòÏìÓ¦¸ü¿ì¡£¶øÇÒ£¬Í¨¹ýÊʵ±µØµ÷ÕûÏ̳߳ØÖеÄÏß³ÌÊýÄ¿£¬Ò²¾ÍÊǵ±ÇëÇóµÄÊýÄ¿³¬¹ýij¸öãÐֵʱ£¬¾ÍÇ¿ÖÆÆäËüÈκÎе½µÄÇëÇóÒ»Ö±µÈ´ý£¬Ö±µ½»ñµÃÒ»¸öÏß³ÌÀ´´¦ÀíΪֹ£¬´Ó¶ø¿ÉÒÔ·ÀÖ¹×ÊÔ´²»×ã¡£

Ï̳߳صÄÌæ´ú·½°¸
Ï̳߳ØÔ¶²»ÊÇ·þÎñÆ÷Ó¦ÓóÌÐòÄÚʹÓöàÏ̵߳ÄΨһ·½·¨¡£ÈçͬÉÏÃæËùÌáµ½µÄ£¬ÓÐʱ£¬ÎªÃ¿¸öÐÂÈÎÎñÉú³ÉÒ»¸öÐÂÏß³ÌÊÇÊ®·ÖÃ÷Öǵġ£È»¶ø£¬Èç¹ûÈÎÎñ´´½¨¹ýÓÚƵ·±¶øÈÎÎñµÄƽ¾ù´¦Àíʱ¼ä¹ý¶Ì£¬ÄÇôΪÿ¸öÈÎÎñÉú³ÉÒ»¸öÐÂÏ߳̽«»áµ¼ÖÂÐÔÄÜÎÊÌâ¡£

ÁíÒ»¸ö³£¼ûµÄÏß³ÌÄ£ÐÍÊÇΪijһÀàÐ͵ÄÈÎÎñ·ÖÅäÒ»¸öºǫ́Ïß³ÌÓëÈÎÎñ¶ÓÁС£AWT ºÍ Swing ¾ÍʹÓÃÕâ¸öÄ£ÐÍ£¬ÔÚÕâ¸öÄ£ÐÍÖÐÓÐÒ»¸ö GUI ʼþỊ̈߳¬µ¼ÖÂÓû§½çÃæ·¢Éú±ä»¯µÄËùÓй¤×÷¶¼±ØÐëÔÚ¸ÃÏß³ÌÖÐÖ´ÐС£È»¶ø£¬ÓÉÓÚÖ»ÓÐÒ»¸ö AWT Ị̈߳¬Òò´ËÒªÔÚ AWT Ïß³ÌÖÐÖ´ÐÐÈÎÎñ¿ÉÄÜÒª»¨·ÑÏ൱³¤Ê±¼ä²ÅÄÜÍê³É£¬ÕâÊDz»¿ÉÈ¡µÄ¡£Òò´Ë£¬Swing Ó¦ÓóÌÐò¾­³£ÐèÒª¶îÍâµÄ¹¤×÷Ị̈߳¬ÓÃÓÚÔËÐÐʱ¼äºÜ³¤µÄ¡¢Í¬ UI ÓйصÄÈÎÎñ¡£

ÿ¸öÈÎÎñ¶ÔÓ¦Ò»¸öÏ̷߳½·¨ºÍµ¥¸öºǫ́Ị̈߳¨single-background-thread£©·½·¨ÔÚijЩÇéÐÎ϶¼¹¤×÷µÃ·Ç³£ÀíÏ롣ÿ¸öÈÎÎñÒ»¸öÏ̷߳½·¨ÔÚÖ»ÓÐÉÙÁ¿ÔËÐÐʱ¼äºÜ³¤µÄÈÎÎñʱ¹¤×÷µÃÊ®·ÖºÃ¡£¶øÖ»Òªµ÷¶È¿ÉÔ¤¼ûÐÔ²»ÊǺÜÖØÒª£¬Ôòµ¥¸öºǫ́Ï̷߳½·¨¾Í¹¤×÷µÃÊ®·ÖºÃ£¬ÈçµÍÓÅÏȼ¶ºǫ́ÈÎÎñ¾ÍÊÇÕâÖÖÇé¿ö¡£È»¶ø£¬´ó¶àÊý·þÎñÆ÷Ó¦ÓóÌÐò¶¼ÊÇÃæÏò´¦Àí´óÁ¿µÄ¶ÌÆÚÈÎÎñ»ò×ÓÈÎÎñ£¬Òò´ËÍùÍùÏ£Íû¾ßÓÐÒ»ÖÖÄܹ»ÒԵͿªÏúÓÐЧµØ´¦ÀíÕâЩÈÎÎñµÄ»úÖÆÒÔ¼°Ò»Ð©×ÊÔ´¹ÜÀíºÍ¶¨Ê±¿ÉÔ¤¼ûÐԵĴëÊ©¡£Ï̳߳ØÌṩÁËÕâЩÓŵ㡣

¹¤×÷¶ÓÁÐ
¾ÍÏ̳߳صÄʵ¼ÊʵÏÖ·½Ê½¶øÑÔ£¬ÊõÓï¡°Ï̳߳ء±ÓÐЩʹÈËÎó½â£¬ÒòΪÏ̳߳ء°Ã÷ÏԵġ±ÊµÏÖÔÚ´ó¶àÊýÇéÐÎϲ¢²»Ò»¶¨²úÉúÎÒÃÇÏ£ÍûµÄ½á¹û¡£ÊõÓï¡°Ï̳߳ء±ÏÈÓÚ Java ƽ̨³öÏÖ£¬Òò´ËËü¿ÉÄÜÊǽÏÉÙÃæÏò¶ÔÏó·½·¨µÄ²úÎȻ¶ø£¬¸ÃÊõÓïÈÔ¼ÌÐø¹ã·ºÓ¦ÓÃ×Å¡£

ËäÈ»ÎÒÃÇ¿ÉÒÔÇáÒ×µØʵÏÖÒ»¸öÏ̳߳ØÀ࣬ÆäÖпͻ§»úÀàµÈ´ýÒ»¸ö¿ÉÓÃÏ̡߳¢½«ÈÎÎñ´«µÝ¸ø¸ÃÏß³ÌÒÔ±ãÖ´ÐС¢È»ºóÔÚÈÎÎñÍê³Éʱ½«Ï̹߳黹¸ø³Ø£¬µ«ÕâÖÖ·½·¨È´´æÔÚ¼¸¸öDZÔڵĸºÃæÓ°Ïì¡£ÀýÈçÔÚ³ØΪ¿Õʱ£¬»á·¢ÉúʲôÄØ£¿ÊÔͼÏò³ØÏ̴߳«µÝÈÎÎñµÄµ÷ÓÃÕ߶¼»á·¢ÏÖ³ØΪ¿Õ£¬ÔÚµ÷ÓÃÕߵȴýÒ»¸ö¿ÉÓõijØÏß³Ìʱ£¬ËüµÄÏ߳̽«×èÈû¡£ÎÒÃÇÖ®ËùÒÔҪʹÓúǫ́Ï̵߳ÄÔ­ÒòÖ®Ò»³£³£ÊÇΪÁË·ÀÖ¹ÕýÔÚÌá½»µÄÏ̱߳»×èÈû¡£ÍêÈ«¶Âסµ÷ÓÃÕߣ¬ÈçÔÚÏ̳߳صġ°Ã÷ÏԵġ±ÊµÏÖµÄÇé¿ö£¬¿ÉÒԶžøÎÒÃÇÊÔͼ½â¾öµÄÎÊÌâµÄ·¢Éú¡£

ÎÒÃÇͨ³£ÏëÒªµÄÊÇͬһ×é¹Ì¶¨µÄ¹¤×÷Ïß³ÌÏà½áºÏµÄ¹¤×÷¶ÓÁУ¬ËüʹÓà wait() ºÍ notify() À´Í¨ÖªµÈ´ýÏß³ÌÐµĹ¤×÷ÒѾ­µ½´ïÁË¡£¸Ã¹¤×÷¶ÓÁÐͨ³£±»ÊµÏֳɾßÓÐÏà¹Ø¼àÊÓÆ÷¶ÔÏóµÄijÖÖÁ´±í¡£Çåµ¥ 1 ÏÔʾÁ˼òµ¥µÄºÏÓù¤×÷¶ÓÁеÄʾÀý¡£¾¡¹Ü Thread API ûÓжÔʹÓà Runnable ½Ó¿ÚÇ¿¼ÓÌØÊâÒªÇ󣬵«Ê¹Óà Runnable ¶ÔÏó¶ÓÁеÄÕâÖÖģʽÊǵ÷¶È³ÌÐòºÍ¹¤×÷¶ÓÁеĹ«¹²Ô¼¶¨¡£

Çåµ¥ 1. ¾ßÓÐÏ̳߳صŤ×÷¶ÓÁÐ
public class WorkQueue
{
private final int nThreads;
private final PoolWorker[] threads;
private final LinkedList queue;

public WorkQueue(int nThreads)
{
this.nThreads = nThreads;
queue = new LinkedList();
threads = new PoolWorker[nThreads];

for (int i=0; ithreads[i] = new PoolWorker();
threads[i].start();
}
}

public void execute(Runnable r) {
synchronized(queue) {
queue.addLast(r);
queue.notify();
}
}

private class PoolWorker extends Thread {
public void run() {
Runnable r;

while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try
{
queue.wait();
}
catch (InterruptedException ignored)
{
}
}

r = (Runnable) queue.removeFirst();
}

// If we don´t catch RuntimeException,
// the pool could leak threads
try {
r.run();
}
catch (RuntimeException e) {
// You might want to log something here
}
}
}
}
}




Äú¿ÉÄÜÒѾ­×¢Òâµ½ÁËÇåµ¥ 1 ÖеÄʵÏÖʹÓõÄÊÇ notify() ¶ø²»ÊÇ notifyAll()¡£´ó¶àÊýר¼Ò½¨ÒéʹÓà notifyAll() ¶ø²»ÊÇ notify()£¬¶øÇÒÀíÓɺܳä·Ö£ºÊ¹Óà notify() ¾ßÓÐÄÑÒÔ×½ÃþµÄ·çÏÕ£¬Ö»ÓÐÔÚijЩÌض¨Ìõ¼þÏÂʹÓø÷½·¨²ÅÊǺÏÊʵġ£ÁíÒ»·½Ã棬Èç¹ûʹÓõõ±£¬notify() ¾ßÓÐ±È notifyAll() ¸ü¿ÉÈ¡µÄÐÔÄÜÌØÕ÷£»ÌرðÊÇ£¬notify() ÒýÆðµÄ»·¾³Çл»ÒªÉٵö࣬ÕâÒ»µãÔÚ·þÎñÆ÷Ó¦ÓóÌÐòÖÐÊǺÜÖØÒªµÄ¡£

Çåµ¥ 1 ÖеÄʾÀý¹¤×÷¶ÓÁÐÂú×ãÁË°²È«Ê¹Óà notify() µÄÐèÇó¡£Òò´Ë£¬Çë¼ÌÐø£¬ÔÚÄúµÄ³ÌÐòÖÐʹÓÃËü£¬µ«ÔÚÆäËüÇéÐÎÏÂʹÓà notify() ʱÇë¸ñÍâСÐÄ¡£

ʹÓÃÏ̳߳صķçÏÕ
ËäÈ»Ï̳߳ØÊǹ¹½¨¶àÏß³ÌÓ¦ÓóÌÐòµÄÇ¿´ó»úÖÆ£¬µ«Ê¹ÓÃËü²¢²»ÊÇûÓзçÏյġ£ÓÃÏ̳߳ع¹½¨µÄÓ¦ÓóÌÐòÈÝÒ×ÔâÊÜÈκÎÆäËü¶àÏß³ÌÓ¦ÓóÌÐòÈÝÒ×ÔâÊܵÄËùÓв¢·¢·çÏÕ£¬ÖîÈçͬ²½´íÎóºÍËÀËø£¬Ëü»¹ÈÝÒ×ÔâÊÜÌض¨ÓÚÏ̳߳صÄÉÙÊýÆäËü·çÏÕ£¬ÖîÈçÓë³ØÓйصÄËÀËø¡¢×ÊÔ´²»×ãºÍÏß³Ìй©¡£

ËÀËø
ÈκζàÏß³ÌÓ¦ÓóÌÐò¶¼ÓÐËÀËø·çÏÕ¡£µ±Ò»×é½ø³Ì»òÏß³ÌÖеÄÿһ¸ö¶¼ÔڵȴýÒ»¸öÖ»ÓиÃ×éÖÐÁíÒ»¸ö½ø³Ì²ÅÄÜÒýÆðµÄʼþʱ£¬ÎÒÃǾÍ˵Õâ×é½ø³Ì»òÏß³ÌËÀËøÁË¡£ËÀËøµÄ×î¼òµ¥ÇéÐÎÊÇ£ºÏß³Ì A ³ÖÓжÔÏó X µÄ¶ÀÕ¼Ëø£¬²¢ÇÒÔڵȴý¶ÔÏó Y µÄËø£¬¶øÏß³Ì B ³ÖÓжÔÏó Y µÄ¶ÀÕ¼Ëø£¬È´Ôڵȴý¶ÔÏó X µÄËø¡£³ý·ÇÓÐijÖÖ·½·¨À´´òÆƶÔËøµÄµÈ´ý£¨Java Ëø¶¨²»Ö§³ÖÕâÖÖ·½·¨£©£¬·ñÔòËÀËøµÄÏ߳̽«ÓÀÔ¶µÈÏÂÈ¥¡£

ËäÈ»ÈκζàÏ̳߳ÌÐòÖж¼ÓÐËÀËøµÄ·çÏÕ£¬µ«Ï̳߳ØÈ´ÒýÈëÁËÁíÒ»ÖÖËÀËø¿ÉÄÜ£¬ÔÚÄÇÖÖÇé¿öÏ£¬ËùÓгØÏ̶߳¼ÔÚÖ´ÐÐÒÑ×èÈûµÄµÈ´ý¶ÓÁÐÖÐÁíÒ»ÈÎÎñµÄÖ´Ðнá¹ûµÄÈÎÎñ£¬µ«ÕâÒ»ÈÎÎñÈ´ÒòΪûÓÐδ±»Õ¼ÓõÄÏ̶߳ø²»ÄÜÔËÐС£µ±Ï̳߳ر»ÓÃÀ´ÊµÏÖÉæ¼°Ðí¶à½»»¥¶ÔÏóµÄÄ£Ä⣬±»Ä£ÄâµÄ¶ÔÏó¿ÉÒÔÏ໥·¢ËͲéѯ£¬ÕâЩ²éѯ½ÓÏÂÀ´×÷ΪÅŶӵÄÈÎÎñÖ´ÐУ¬²éѯ¶ÔÏóÓÖͬ²½µÈ´ý×ÅÏìӦʱ£¬»á·¢ÉúÕâÖÖÇé¿ö¡£

×ÊÔ´²»×ã
Ï̳߳صÄÒ»¸öÓŵãÔÚÓÚ£ºÏà¶ÔÓÚÆäËüÌæ´úµ÷¶È»úÖÆ£¨ÓÐЩÎÒÃÇÒѾ­ÌÖÂÛ¹ý£©¶øÑÔ£¬ËüÃÇͨ³£Ö´Ðеúܺᣵ«Ö»ÓÐÇ¡µ±µØµ÷ÕûÁËÏ̳߳شóСʱ²ÅÊÇÕâÑùµÄ¡£Ïß³ÌÏûºÄ°üÀ¨ÄÚ´æºÍÆäËüϵͳ×ÊÔ´ÔÚÄڵĴóÁ¿×ÊÔ´¡£³ýÁË Thread ¶ÔÏóËùÐèµÄÄÚ´æÖ®Í⣬ÿ¸öÏ̶߳¼ÐèÒªÁ½¸ö¿ÉÄܴܺóµÄÖ´Ðе÷ÓöÑÕ»¡£³ý´ËÒÔÍ⣬JVM ¿ÉÄÜ»áΪÿ¸ö Java Ï̴߳´½¨Ò»¸ö±¾»úỊ̈߳¬ÕâЩ±¾»úÏ߳̽«ÏûºÄ¶îÍâµÄϵͳ×ÊÔ´¡£×îºó£¬ËäÈ»Ïß³ÌÖ®¼äÇл»µÄµ÷¶È¿ªÏúºÜС£¬µ«Èç¹ûÓкܶàỊ̈߳¬»·¾³Çл»Ò²¿ÉÄÜÑÏÖصØÓ°Ïì³ÌÐòµÄÐÔÄÜ¡£

Èç¹ûÏ̳߳ØÌ«´ó£¬ÄÇô±»ÄÇЩÏß³ÌÏûºÄµÄ×ÊÔ´¿ÉÄÜÑÏÖصØÓ°ÏìϵͳÐÔÄÜ¡£ÔÚÏß³ÌÖ®¼ä½øÐÐÇл»½«»áÀË·Ñʱ¼ä£¬¶øÇÒʹÓó¬³ö±ÈÄúʵ¼ÊÐèÒªµÄÏ߳̿ÉÄÜ»áÒýÆð×ÊÔ´ØÑ·¦ÎÊÌ⣬ÒòΪ³ØÏß³ÌÕýÔÚÏûºÄһЩ×ÊÔ´£¬¶øÕâЩ×ÊÔ´¿ÉÄܻᱻÆäËüÈÎÎñ¸üÓÐЧµØÀûÓᣳýÁËÏß³Ì×ÔÉíËùʹÓõÄ×ÊÔ´ÒÔÍ⣬·þÎñÇëÇóʱËù×öµÄ¹¤×÷¿ÉÄÜÐèÒªÆäËü×ÊÔ´£¬ÀýÈç JDBC Á¬½Ó¡¢Ì×½Ó×Ö»òÎļþ¡£ÕâЩҲ¶¼ÊÇÓÐÏÞ×ÊÔ´£¬ÓÐÌ«¶àµÄ²¢·¢ÇëÇóÒ²¿ÉÄÜÒýÆðʧЧ£¬ÀýÈç²»ÄÜ·ÖÅä JDBC Á¬½Ó¡£

²¢·¢´íÎó
Ï̳߳غÍÆäËüÅŶӻúÖÆÒÀ¿¿Ê¹Óà wait() ºÍ notify() ·½·¨£¬ÕâÁ½¸ö·½·¨¶¼ÄÑÓÚʹÓá£Èç¹û±àÂë²»ÕýÈ·£¬ÄÇô¿ÉÄܶªÊ§Í¨Öª£¬µ¼ÖÂÏ̱߳£³Ö¿ÕÏÐ״̬£¬¾¡¹Ü¶ÓÁÐÖÐÓй¤×÷Òª´¦Àí¡£Ê¹ÓÃÕâЩ·½·¨Ê±£¬±ØÐë¸ñÍâСÐÄ£»¼´±ãÊÇר¼ÒÒ²¿ÉÄÜÔÚËüÃÇÉÏÃæ³ö´í¡£¶ø×îºÃʹÓÃÏÖÓеġ¢ÒѾ­ÖªµÀÄܹ¤×÷µÄʵÏÖ£¬ÀýÈçÔÚÏÂÃæµÄÎÞÐë±àдÄú×Ô¼ºµÄ³ØÖÐÌÖÂÛµÄ util.concurrent °ü¡£

Ïß³Ìй©
¸÷ÖÖÀàÐ͵ÄÏ̳߳ØÖÐÒ»¸öÑÏÖصķçÏÕÊÇÏß³Ìй©£¬µ±´Ó³ØÖгýÈ¥Ò»¸öÏß³ÌÒÔÖ´ÐÐÒ»ÏîÈÎÎñ£¬¶øÔÚÈÎÎñÍê³Éºó¸ÃÏß³ÌȴûÓзµ»Ø³Øʱ£¬»á·¢ÉúÕâÖÖÇé¿ö¡£·¢ÉúÏß³Ìй©µÄÒ»ÖÖÇéÐγöÏÖÔÚÈÎÎñÅ׳öÒ»¸ö RuntimeException »òÒ»¸ö Error ʱ¡£Èç¹û³ØÀàûÓв¶×½µ½ËüÃÇ£¬ÄÇôÏß³ÌÖ»»áÍ˳ö¶øÏ̳߳صĴóС½«»áÓÀ¾Ã¼õÉÙÒ»¸ö¡£µ±ÕâÖÖÇé¿ö·¢ÉúµÄ´ÎÊý×ã¹»¶àʱ£¬Ï̳߳Ø×îÖÕ¾ÍΪ¿Õ£¬¶øÇÒϵͳ½«Í£Ö¹£¬ÒòΪûÓпÉÓõÄÏß³ÌÀ´´¦ÀíÈÎÎñ¡£

ÓÐЩÈÎÎñ¿ÉÄÜ»áÓÀÔ¶µÈ´ýijЩ×ÊÔ´»òÀ´×ÔÓû§µÄÊäÈ룬¶øÕâЩ×ÊÔ´ÓÖ²»Äܱ£Ö¤±äµÃ¿ÉÓã¬Óû§¿ÉÄÜÒ²ÒѾ­»Ø¼ÒÁË£¬ÖîÈç´ËÀàµÄÈÎÎñ»áÓÀ¾ÃÍ£Ö¹£¬¶øÕâЩֹͣµÄÈÎÎñÒ²»áÒýÆðºÍÏß³Ìй©ͬÑùµÄÎÊÌâ¡£Èç¹ûij¸öÏ̱߳»ÕâÑùÒ»¸öÈÎÎñÓÀ¾ÃµØÏûºÄ×Å£¬ÄÇôËüʵ¼ÊÉϾͱ»´Ó³Ø³ýÈ¥ÁË¡£¶ÔÓÚÕâÑùµÄÈÎÎñ£¬Ó¦¸ÃҪôֻ¸øÓèËüÃÇ×Ô¼ºµÄỊ̈߳¬ÒªÃ´Ö»ÈÃËüÃǵȴýÓÐÏÞµÄʱ¼ä¡£

ÇëÇó¹ýÔØ
½ö½öÊÇÇëÇó¾Íѹ¿åÁË·þÎñÆ÷£¬ÕâÖÖÇé¿öÊÇ¿ÉÄܵġ£ÔÚÕâÖÖÇéÐÎÏ£¬ÎÒÃÇ¿ÉÄܲ»Ï뽫ÿ¸öµ½À´µÄÇëÇó¶¼ÅŶӵ½ÎÒÃǵŤ×÷¶ÓÁУ¬ÒòΪÅÅÔÚ¶ÓÁÐÖеȴýÖ´ÐеÄÈÎÎñ¿ÉÄÜ»áÏûºÄÌ«¶àµÄϵͳ×ÊÔ´²¢ÒýÆð×ÊԴȱ·¦¡£ÔÚÕâÖÖÇéÐÎϾö¶¨ÈçºÎ×öÈ¡¾öÓÚÄú×Ô¼º£»ÔÚijЩÇé¿öÏ£¬Äú¿ÉÒÔ¼òµ¥µØÅ×ÆúÇëÇó£¬ÒÀ¿¿¸ü¸ß¼¶±ðµÄЭÒéÉÔºóÖØÊÔÇëÇó£¬ÄúÒ²¿ÉÒÔÓÃÒ»¸öÖ¸³ö·þÎñÆ÷ÔÝʱºÜæµÄÏìÓ¦À´¾Ü¾øÇëÇó¡£

ÓÐЧʹÓÃÏ̳߳صÄ×¼Ôò
Ö»ÒªÄú×ñÑ­¼¸Ìõ¼òµ¥µÄ×¼Ôò£¬Ï̳߳ؿÉÒÔ³ÉΪ¹¹½¨·þÎñÆ÷Ó¦ÓóÌÐòµÄ¼«ÆäÓÐЧµÄ·½·¨£º

²»Òª¶ÔÄÇЩͬ²½µÈ´ýÆäËüÈÎÎñ½á¹ûµÄÈÎÎñÅŶӡ£Õâ¿ÉÄܻᵼÖÂÉÏÃæËùÃèÊöµÄÄÇÖÖÐÎʽµÄËÀËø£¬ÔÚÄÇÖÖËÀËøÖУ¬ËùÓÐÏ̶߳¼±»Ò»Ð©ÈÎÎñËùÕ¼Óã¬ÕâЩÈÎÎñÒÀ´ÎµÈ´ýÅŶÓÈÎÎñµÄ½á¹û£¬¶øÕâЩÈÎÎñÓÖÎÞ·¨Ö´ÐУ¬ÒòΪËùÓеÄÏ̶߳¼ºÜæ¡£


ÔÚΪʱ¼ä¿ÉÄܺܳ¤µÄ²Ù×÷ʹÓúÏÓõÄÏß³ÌʱҪСÐÄ¡£Èç¹û³ÌÐò±ØÐëµÈ´ýÖîÈç I/O Íê³ÉÕâÑùµÄij¸ö×ÊÔ´£¬ÄÇôÇëÖ¸¶¨×µÄµÈ´ýʱ¼ä£¬ÒÔ¼°ËæºóÊÇʧЧ»¹Êǽ«ÈÎÎñÖØÐÂÅŶÓÒÔ±ãÉÔºóÖ´ÐС£ÕâÑù×ö±£Ö¤ÁË£ºÍ¨¹ý½«Ä³¸öÏß³ÌÊͷŸøij¸ö¿ÉÄܳɹ¦Íê³ÉµÄÈÎÎñ£¬´Ó¶ø½«×îÖÕÈ¡µÃijЩ½øÕ¹¡£


Àí½âÈÎÎñ¡£ÒªÓÐЧµØµ÷ÕûÏ̳߳شóС£¬ÄúÐèÒªÀí½âÕýÔÚÅŶӵÄÈÎÎñÒÔ¼°ËüÃÇÕýÔÚ×öʲô¡£ËüÃÇÊÇ CPU ÏÞÖƵģ¨CPU-bound£©Âð£¿ËüÃÇÊÇ I/O ÏÞÖƵģ¨I/O-bound£©Âð£¿ÄúµÄ´ð°¸½«Ó°ÏìÄúÈçºÎµ÷ÕûÓ¦ÓóÌÐò¡£Èç¹ûÄúÓв»Í¬µÄÈÎÎñÀ࣬ÕâЩÀàÓÐ׎ØÈ»²»Í¬µÄÌØÕ÷£¬ÄÇôΪ²»Í¬ÈÎÎñÀàÉèÖöà¸ö¹¤×÷¶ÓÁпÉÄÜ»áÓÐÒâÒ壬ÕâÑù¿ÉÒÔÏàÓ¦µØµ÷Õûÿ¸ö³Ø¡£
µ÷Õû³ØµÄ´óС
µ÷ÕûÏ̳߳صĴóС»ù±¾ÉϾÍÊDZÜÃâÁ½Àà´íÎó£ºÏß³ÌÌ«ÉÙ»òÏß³ÌÌ«¶à¡£ÐÒÔ˵ÄÊÇ£¬¶ÔÓÚ´ó¶àÊýÓ¦ÓóÌÐòÀ´Ëµ£¬Ì«¶àºÍÌ«ÉÙÖ®¼äµÄÓàµØÏ൱¿í¡£

Çë»ØÒ䣺ÔÚÓ¦ÓóÌÐòÖÐʹÓÃÏß³ÌÓÐÁ½¸öÖ÷ÒªÓŵ㣬¾¡¹ÜÔڵȴýÖîÈç I/O µÄÂý²Ù×÷£¬µ«ÔÊÐí¼ÌÐø½øÐд¦Àí£¬²¢ÇÒ¿ÉÒÔÀûÓöദÀíÆ÷¡£ÔÚÔËÐÐÓÚ¾ßÓÐ N ¸ö´¦ÀíÆ÷»úÆ÷ÉϵļÆËãÏÞÖƵÄÓ¦ÓóÌÐòÖУ¬ÔÚÏß³ÌÊýÄ¿½Ó½ü N ʱÌí¼Ó¶îÍâµÄÏ߳̿ÉÄÜ»á¸ÄÉÆ×Ü´¦ÀíÄÜÁ¦£¬¶øÔÚÏß³ÌÊýÄ¿³¬¹ý N ʱÌí¼Ó¶îÍâµÄÏ߳̽«²»Æð×÷Óá£ÊÂʵÉÏ£¬Ì«¶àµÄÏß³ÌÉõÖÁ»á½µµÍÐÔÄÜ£¬ÒòΪËü»áµ¼Ö¶îÍâµÄ»·¾³Çл»¿ªÏú¡£

Ï̳߳صÄ×î¼Ñ´óСȡ¾öÓÚ¿ÉÓô¦ÀíÆ÷µÄÊýÄ¿ÒÔ¼°¹¤×÷¶ÓÁÐÖеÄÈÎÎñµÄÐÔÖÊ¡£ÈôÔÚÒ»¸ö¾ßÓÐ N ¸ö´¦ÀíÆ÷µÄϵͳÉÏÖ»ÓÐÒ»¸ö¹¤×÷¶ÓÁУ¬ÆäÖÐÈ«²¿ÊǼÆËãÐÔÖʵÄÈÎÎñ£¬ÔÚÏ̳߳ؾßÓÐ N »ò N+1 ¸öÏß³Ìʱһ°ã»á»ñµÃ×î´óµÄ CPU ÀûÓÃÂÊ¡£

¶ÔÓÚÄÇЩ¿ÉÄÜÐèÒªµÈ´ý I/O Íê³ÉµÄÈÎÎñ£¨ÀýÈ磬´ÓÌ×½Ó×Ö¶ÁÈ¡ HTTP ÇëÇóµÄÈÎÎñ£©£¬ÐèÒªÈóصĴóС³¬¹ý¿ÉÓô¦ÀíÆ÷µÄÊýÄ¿£¬ÒòΪ²¢²»ÊÇËùÓÐÏ̶߳¼Ò»Ö±ÔÚ¹¤×÷¡£Í¨¹ýʹÓøÅÒª·ÖÎö£¬Äú¿ÉÒÔ¹À¼Æij¸öµäÐÍÇëÇóµÄµÈ´ýʱ¼ä£¨WT£©Óë·þÎñʱ¼ä£¨ST£©Ö®¼äµÄ±ÈÀý¡£Èç¹ûÎÒÃǽ«ÕâÒ»±ÈÀý³Æ֮Ϊ WT/ST£¬ÄÇô¶ÔÓÚÒ»¸ö¾ßÓÐ N ¸ö´¦ÀíÆ÷µÄϵͳ£¬ÐèÒªÉèÖôóÔ¼ N*(1+WT/ST) ¸öÏß³ÌÀ´±£³Ö´¦ÀíÆ÷µÃµ½³ä·ÖÀûÓá£

´¦ÀíÆ÷ÀûÓÃÂʲ»Êǵ÷ÕûÏ̳߳شóС¹ý³ÌÖеÄΨһ¿¼ÂÇÊÂÏî¡£Ëæ×ÅÏ̳߳صÄÔö³¤£¬Äú¿ÉÄÜ»áÅöµ½µ÷¶È³ÌÐò¡¢¿ÉÓÃÄÚ´æ·½ÃæµÄÏÞÖÆ£¬»òÕßÆäËüϵͳ×ÊÔ´·½ÃæµÄÏÞÖÆ£¬ÀýÈçÌ×½Ó×Ö¡¢´ò¿ªµÄÎļþ¾ä±ú»òÊý¾Ý¿âÁ¬½ÓµÈµÄÊýÄ¿¡£

ÎÞÐë±àдÄú×Ô¼ºµÄ³Ø
Doug Lea ±àдÁËÒ»¸öÓÅÐãµÄ²¢·¢ÊµÓóÌÐò¿ª·ÅÔ´Âë¿â util.concurrent£¬Ëü°üÀ¨»¥³â¡¢ÐźÅÁ¿¡¢ÖîÈçÔÚ²¢·¢·ÃÎÊÏÂÖ´ÐеúܺõĶÓÁкÍÉ¢ÁбíÖ®À༯ºÏÀàÒÔ¼°¼¸¸ö¹¤×÷¶ÓÁÐʵÏÖ¡£¸Ã°üÖÐµÄ PooledExecutor ÀàÊÇÒ»ÖÖÓÐЧµÄ¡¢¹ã·ºÊ¹ÓõÄÒÔ¹¤×÷¶ÓÁÐΪ»ù´¡µÄÏ̳߳صÄÕýȷʵÏÖ¡£ÄúÎÞÐë³¢ÊÔ±àдÄú×Ô¼ºµÄÏ̳߳أ¬ÕâÑù×öÈÝÒ׳ö´í£¬Ïà·´Äú¿ÉÒÔ¿¼ÂÇʹÓà util.concurrent ÖеÄһЩʵÓóÌÐò¡£²ÎÔIJο¼×ÊÁÏÒÔ»ñÈ¡Á´½ÓºÍ¸ü¶àÐÅÏ¢¡£

util.concurrent ¿âÒ²¼¤·¢ÁË JSR 166£¬JSR 166 ÊÇÒ»¸ö Java ÉçÇø¹ý³Ì£¨Java Community Process (JCP)£©¹¤×÷×飬ËûÃÇÕýÔÚ´òË㿪·¢Ò»×é°üº¬ÔÚ java.util.concurrent °üÏ嵀 Java Àà¿âÖеIJ¢·¢ÊµÓóÌÐò£¬Õâ¸ö°üÓ¦¸ÃÓÃÓÚ Java ¿ª·¢¹¤¾ßÏä 1.5 ·¢Ðа档

½áÊøÓï
Ï̳߳ØÊÇ×éÖ¯·þÎñÆ÷Ó¦ÓóÌÐòµÄÓÐÓù¤¾ß¡£ËüÔÚ¸ÅÄîÉÏÊ®·Ö¼òµ¥£¬µ«ÔÚʵÏÖºÍʹÓÃÒ»¸ö³Øʱ£¬È´ÐèҪעÒ⼸¸öÎÊÌ⣬ÀýÈçËÀËø¡¢×ÊÔ´²»×ãºÍ wait() ¼° notify() µÄ¸´ÔÓÐÔ¡£Èç¹ûÄú·¢ÏÖÄúµÄÓ¦ÓóÌÐòÐèÒªÏ̳߳أ¬ÄÇôÇ뿼ÂÇʹÓà util.concurrent ÖеÄij¸ö Executor À࣬ÀýÈç PooledExecutor£¬¶ø²»ÓôÓÍ·¿ªÊ¼±àд¡£Èç¹ûÄúÒª×Ô¼º´´½¨Ïß³ÌÀ´´¦ÀíÉú´æÆں̵ܶÄÈÎÎñ£¬ÄÇôÄú¾ø¶ÔÓ¦¸Ã¿¼ÂÇʹÓÃÏ̳߳ØÀ´Ìæ´ú¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ