Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
´ÓʹÓõ½Ô­ÀíѧϰJavaÏ̳߳Ø
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ 2016-9-14
  1767  次浏览      27
 

Ï̳߳صļ¼Êõ±³¾°

ÔÚÃæÏò¶ÔÏó±à³ÌÖУ¬´´½¨ºÍÏú»Ù¶ÔÏóÊǺܷÑʱ¼äµÄ£¬ÒòΪ´´½¨Ò»¸ö¶ÔÏóÒª»ñÈ¡ÄÚ´æ×ÊÔ´»òÕ߯äËü¸ü¶à×ÊÔ´¡£ÔÚJavaÖиüÊÇÈç´Ë£¬ÐéÄâ»ú½«ÊÔͼ¸ú×Ùÿһ¸ö¶ÔÏó£¬ÒÔ±ãÄܹ»ÔÚ¶ÔÏóÏú»Ùºó½øÐÐÀ¬»ø»ØÊÕ¡£

ËùÒÔÌá¸ß·þÎñ³ÌÐòЧÂʵÄÒ»¸öÊֶξÍÊǾ¡¿ÉÄܼõÉÙ´´½¨ºÍÏú»Ù¶ÔÏóµÄ´ÎÊý£¬ÌرðÊÇһЩºÜºÄ×ÊÔ´µÄ¶ÔÏó´´½¨ºÍÏú»Ù¡£ÈçºÎÀûÓÃÒÑÓжÔÏóÀ´·þÎñ¾ÍÊÇÒ»¸öÐèÒª½â¾öµÄ¹Ø¼üÎÊÌ⣬ÆäʵÕâ¾ÍÊÇһЩ¡±³Ø»¯×ÊÔ´¡±¼¼Êõ²úÉúµÄÔ­Òò¡£

ÀýÈçAndroidÖг£¼ûµ½µÄºÜ¶àͨÓÃ×é¼þÒ»°ã¶¼Àë²»¿ª¡±³Ø¡±µÄ¸ÅÄÈç¸÷ÖÖͼƬ¼ÓÔØ¿â£¬ÍøÂçÇëÇó¿â£¬¼´Ê¹AndroidµÄÏûÏ¢´«µÝ»úÖÆÖеÄMeaasgeµ±Ê¹ÓÃMeaasge.obtain()¾ÍÊÇʹÓõÄMeaasge³ØÖеĶÔÏó£¬Òò´ËÕâ¸ö¸ÅÄîºÜÖØÒª¡£±¾ÎĽ«½éÉܵÄÏ̳߳ؼ¼ÊõͬÑù·ûºÏÕâһ˼Ïë¡£

Ï̳߳صÄÓŵã:

1.ÖØÓÃÏ̳߳ØÖеÄÏß³Ì,¼õÉÙÒò¶ÔÏó´´½¨,Ïú»ÙËù´øÀ´µÄÐÔÄÜ¿ªÏú;

2.ÄÜÓÐЧµÄ¿ØÖÆÏ̵߳Ä×î´ó²¢·¢Êý,Ìá¸ßϵͳ×ÊÔ´ÀûÓÃÂÊ,ͬʱ±ÜÃâ¹ý¶àµÄ×ÊÔ´¾ºÕù,±ÜÃâ¶ÂÈû;

3.Äܹ»¶àÏ߳̽øÐмòµ¥µÄ¹ÜÀí,ʹÏ̵߳ÄʹÓüòµ¥¡¢¸ßЧ¡£

Ï̳߳ؿò¼ÜExecutor

javaÖеÄÏ̳߳ØÊÇͨ¹ýExecutor¿ò¼ÜʵÏֵģ¬Executor ¿ò¼Ü°üÀ¨ÀࣺExecutor£¬Executors£¬ExecutorService£¬ThreadPoolExecutor £¬CallableºÍFuture¡¢FutureTaskµÄʹÓõȡ£

Executor: ËùÓÐÏ̳߳صĽӿÚ,Ö»ÓÐÒ»¸ö·½·¨¡£

public interface Executor {        
void execute(Runnable command);
}

ExecutorService: Ôö¼ÓExecutorµÄÐÐΪ£¬ÊÇExecutorʵÏÖÀàµÄ×îÖ±½Ó½Ó¿Ú¡£

Executors£º ÌṩÁËһϵÁй¤³§·½·¨ÓÃÓÚ´´ÏÈÏ̳߳أ¬·µ»ØµÄÏ̳߳ض¼ÊµÏÖÁËExecutorService ½Ó¿Ú¡£

ThreadPoolExecutor£ºÏ̳߳صľßÌåʵÏÖÀà,Ò»°ãÓõĸ÷ÖÖÏ̳߳ض¼ÊÇ»ùÓÚÕâ¸öÀàʵÏֵġ£ ¹¹Ôì·½·¨ÈçÏÂ:

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {

this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);

}

corePoolSize£ºÏ̳߳صĺËÐÄÏß³ÌÊý,Ï̳߳ØÖÐÔËÐеÄÏß³ÌÊýÒ²ÓÀÔ¶²»»á³¬¹ý corePoolSize ¸ö,ĬÈÏÇé¿öÏ¿ÉÒÔÒ»Ö±´æ»î¡£¿ÉÒÔͨ¹ýÉèÖÃallowCoreThreadTimeOutΪTrue,´Ëʱ ºËÐÄÏß³ÌÊý¾ÍÊÇ0,´ËʱkeepAliveTime¿ØÖÆËùÓÐÏ̵߳ij¬Ê±Ê±¼ä¡£

maximumPoolSize£ºÏ̳߳ØÔÊÐíµÄ×î´óÏß³ÌÊý;

keepAliveTime£º Ö¸µÄÊÇ¿ÕÏÐÏ߳̽áÊøµÄ³¬Ê±Ê±¼ä;

unit £ºÊÇÒ»¸öö¾Ù£¬±íʾ keepAliveTime µÄµ¥Î»;

workQueue£º±íʾ´æ·ÅÈÎÎñµÄBlockingQueue<Runnable¶ÓÁС£

BlockingQueue:×èÈû¶ÓÁУ¨BlockingQueue£©ÊÇjava.util.concurrentϵÄÖ÷ÒªÓÃÀ´¿ØÖÆÏß³Ìͬ²½µÄ¹¤¾ß¡£Èç¹ûBlockQueueÊǿյÄ,´ÓBlockingQueueÈ¡¶«Î÷µÄ²Ù×÷½«»á±»×è¶Ï½øÈëµÈ´ý״̬,Ö±µ½BlockingQueue½øÁ˶«Î÷²Å»á±»»½ÐÑ¡£Í¬Ñù,Èç¹ûBlockingQueueÊÇÂúµÄ,ÈκÎÊÔͼÍùÀï´æ¶«Î÷µÄ²Ù×÷Ò²»á±»×è¶Ï½øÈëµÈ´ý״̬,Ö±µ½BlockingQueueÀïÓпռä²Å»á±»»½ÐѼÌÐø²Ù×÷¡£ ×èÈû¶ÓÁг£ÓÃÓÚÉú²úÕߺÍÏû·ÑÕߵij¡¾°£¬Éú²úÕßÊÇÍù¶ÓÁÐÀïÌí¼ÓÔªËØµÄỊ̈߳¬Ïû·ÑÕßÊÇ´Ó¶ÓÁÐÀïÄÃÔªËØµÄÏ̡߳£×èÈû¶ÓÁоÍÊÇÉú²úÕß´æ·ÅÔªËØµÄÈÝÆ÷£¬¶øÏû·ÑÕßÒ²Ö»´ÓÈÝÆ÷ÀïÄÃÔªËØ¡£¾ßÌåµÄʵÏÖÀàÓÐLinkedBlockingQueue,ArrayBlockingQueuedµÈ¡£Ò»°ãÆäÄÚ²¿µÄ¶¼ÊÇͨ¹ýLockºÍCondition(ÏÔÊ¾Ëø£¨Lock£©¼°ConditionµÄѧϰÓëʹÓÃ)À´ÊµÏÖ×èÈûºÍ»½ÐÑ¡£

Ï̳߳صŤ×÷¹ý³ÌÈçÏ£º

Ï̳߳ظմ´½¨Ê±£¬ÀïÃæÃ»ÓÐÒ»¸öÏ̡߳£ÈÎÎñ¶ÓÁÐÊÇ×÷Ϊ²ÎÊý´«½øÀ´µÄ¡£²»¹ý£¬¾ÍËã¶ÓÁÐÀïÃæÓÐÈÎÎñ£¬Ï̳߳ØÒ²²»»áÂíÉÏÖ´ÐÐËüÃÇ¡£

µ±µ÷Óà execute() ·½·¨Ìí¼ÓÒ»¸öÈÎÎñʱ£¬Ï̳߳ػá×öÈçÏÂÅжϣº

Èç¹ûÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿Ð¡ÓÚ corePoolSize£¬ÄÇôÂíÉÏ´´½¨Ïß³ÌÔËÐÐÕâ¸öÈÎÎñ£»

Èç¹ûÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿´óÓÚ»òµÈÓÚ corePoolSize£¬ÄÇô½«Õâ¸öÈÎÎñ·ÅÈë¶ÓÁУ»

Èç¹ûÕâʱºò¶ÓÁÐÂúÁË£¬¶øÇÒÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿Ð¡ÓÚ maximumPoolSize£¬ÄÇô»¹ÊÇÒª´´½¨·ÇºËÐÄÏß³ÌÁ¢¿ÌÔËÐÐÕâ¸öÈÎÎñ£»

Èç¹û¶ÓÁÐÂúÁË£¬¶øÇÒÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿´óÓÚ»òµÈÓÚ maximumPoolSize£¬ÄÇôÏ̳߳ػáÅ׳öÒì³£RejectExecutionException¡£

µ±Ò»¸öÏß³ÌÍê³ÉÈÎÎñʱ£¬Ëü»á´Ó¶ÓÁÐÖÐÈ¡ÏÂÒ»¸öÈÎÎñÀ´Ö´ÐС£

µ±Ò»¸öÏß³ÌÎÞÊ¿É×ö£¬³¬¹ýÒ»¶¨µÄʱ¼ä£¨keepAliveTime£©Ê±£¬Ï̳߳ػáÅжϣ¬Èç¹ûµ±Ç°ÔËÐеÄÏß³ÌÊý´óÓÚ corePoolSize£¬ÄÇôÕâ¸öÏ߳̾ͱ»Í£µô¡£ËùÒÔÏ̳߳صÄËùÓÐÈÎÎñÍê³Éºó£¬Ëü×îÖÕ»áÊÕËõµ½ corePoolSize µÄ´óС¡£

Ï̳߳صĴ´½¨ºÍʹÓÃ

Éú³ÉÏ̳߳زÉÓÃÁ˹¤¾ßÀàExecutorsµÄ¾²Ì¬·½·¨£¬ÒÔÏÂÊǼ¸ÖÖ³£¼ûµÄÏ̳߳ء£

SingleThreadExecutor£ºµ¥¸öºǫ́Ïß³Ì (Æä»º³å¶ÓÁÐÊÇÎÞ½çµÄ)

public static ExecutorService newSingleThreadExecutor() {        
return new FinalizableDelegatedExecutorService (
new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}

´´½¨Ò»¸öµ¥Ï̵߳ÄÏ̳߳ء£Õâ¸öÏ̳߳ØÖ»ÓÐÒ»¸öºËÐÄÏß³ÌÔÚ¹¤×÷£¬Ò²¾ÍÊÇÏ൱ÓÚµ¥Ï̴߳®ÐÐÖ´ÐÐËùÓÐÈÎÎñ¡£Èç¹ûÕâ¸öΨһµÄÏß³ÌÒòΪÒì³£½áÊø£¬ÄÇô»áÓÐÒ»¸öеÄÏß³ÌÀ´Ìæ´úËü¡£´ËÏ̳߳ر£Ö¤ËùÓÐÈÎÎñµÄÖ´ÐÐ˳Ðò°´ÕÕÈÎÎñµÄÌύ˳ÐòÖ´ÐС£

FixedThreadPool£ºÖ»ÓкËÐÄÏ̵߳ÄÏ̳߳Ø,´óС¹Ì¶¨ (Æä»º³å¶ÓÁÐÊÇÎÞ½çµÄ) ¡£

public static ExecutorService newFixedThreadPool(int nThreads) {         
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

´´½¨¹Ì¶¨´óСµÄÏ̳߳ء£Ã¿´ÎÌá½»Ò»¸öÈÎÎñ¾Í´´½¨Ò»¸öỊ̈߳¬Ö±µ½Ï̴߳ﵽÏ̳߳صÄ×î´ó´óС¡£Ï̳߳صĴóСһµ©´ïµ½×î´óÖµ¾Í»á±£³Ö²»±ä£¬Èç¹ûij¸öÏß³ÌÒòΪִÐÐÒì³£¶ø½áÊø£¬ÄÇôÏ̳߳ػᲹ³äÒ»¸öÐÂÏ̡߳£

CachedThreadPool£ºÎÞ½çÏ̳߳أ¬¿ÉÒÔ½øÐÐ×Ô¶¯Ï̻߳ØÊÕ¡£

public static ExecutorService newCachedThreadPool() {         
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}

Èç¹ûÏ̳߳صĴóС³¬¹ýÁË´¦ÀíÈÎÎñËùÐèÒªµÄỊ̈߳¬ÄÇô¾Í»á»ØÊÕ²¿·Ö¿ÕÏУ¨60Ãë²»Ö´ÐÐÈÎÎñ£©µÄỊ̈߳¬µ±ÈÎÎñÊýÔö¼Óʱ£¬´ËÏ̳߳ØÓÖ¿ÉÒÔÖÇÄܵÄÌí¼ÓÐÂÏß³ÌÀ´´¦ÀíÈÎÎñ¡£´ËÏ̳߳ز»»á¶ÔÏ̳߳شóС×öÏÞÖÆ£¬Ï̳߳شóСÍêÈ«ÒÀÀµÓÚ²Ù×÷ϵͳ£¨»òÕß˵JVM£©Äܹ»´´½¨µÄ×î´óÏ̴߳óС¡£SynchronousQueueÊÇÒ»¸öÊÇ»º³åÇøÎª1µÄ×èÈû¶ÓÁС£

ScheduledThreadPool£ººËÐÄÏ̳߳ع̶¨£¬´óСÎÞÏÞµÄÏ̳߳ء£´ËÏ̳߳ØÖ§³Ö¶¨Ê±ÒÔ¼°ÖÜÆÚÐÔÖ´ÐÐÈÎÎñµÄÐèÇó¡£

public static ExecutorService newScheduledThreadPool(int corePoolSize) {         
return new ScheduledThreadPool(corePoolSize,
Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}

´´½¨Ò»¸öÖÜÆÚÐÔÖ´ÐÐÈÎÎñµÄÏ̳߳ء£Èç¹ûÏÐÖÃ,·ÇºËÐÄÏ̳߳ػáÔÚDEFAULT_KEEPALIVEMILLISʱ¼äÄÚ»ØÊÕ¡£

Ï̳߳Ø×î³£ÓõÄÌá½»ÈÎÎñµÄ·½·¨ÓÐÁ½ÖÖ£º

execute:

ExecutorService.execute(Runnable runable)£»

submit:

FutureTask task = ExecutorService.submit(Runnable runnable);

FutureTask<T> task = ExecutorService.submit(Runnable runnable,T Result);

FutureTask<T> task = ExecutorService.submit(Callable<T> callable);

submit(Callable callable)µÄʵÏÖ£¬submit(Runnable runnable)ͬÀí¡£

public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
FutureTask<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}

¿ÉÒÔ¿´³ösubmit¿ªÆôµÄÊÇÓзµ»Ø½á¹ûµÄÈÎÎñ£¬»á·µ»ØÒ»¸öFutureTask¶ÔÏó£¬ÕâÑù¾ÍÄÜͨ¹ýget()·½·¨µÃµ½½á¹û¡£submit×îÖÕµ÷ÓõÄÒ²ÊÇexecute(Runnable runable)£¬submitÖ»Êǽ«Callable¶ÔÏó»òRunnable·â×°³ÉÒ»¸öFutureTask¶ÔÏó£¬ÒòΪFutureTaskÊǸöRunnable£¬ËùÒÔ¿ÉÒÔÔÚexecuteÖÐÖ´ÐС£¹ØÓÚCallable¶ÔÏóºÍRunnableÔõô·â×°³ÉFutureTask¶ÔÏ󣬼ûCallableºÍFuture¡¢FutureTaskµÄʹÓá£

Ï̳߳ØÊµÏÖµÄÔ­Àí

Èç¹ûÖ»½²Ï̳߳صÄʹÓã¬ÄÇÕâÆª²©¿ÍûÓÐʲô´óµÄ¼ÛÖµ£¬³äÆäÁ¿Ò²¾ÍÊÇÊìϤExecutorÏà¹ØAPIµÄ¹ý³Ì¡£Ï̳߳صÄʵÏÖ¹ý³ÌûÓÐÓõ½Synchronized¹Ø¼ü×Ö£¬ÓõͼÊÇVolatile,LockºÍͬ²½(×èÈû)¶ÓÁÐ,AtomicÏà¹ØÀ࣬FutureTaskµÈµÈ£¬ÒòΪºóÕßµÄÐÔÄܸüÓÅ¡£Àí½âµÄ¹ý³Ì¿ÉÒԺܺõÄѧϰԴÂëÖв¢·¢¿ØÖƵÄ˼Ïë¡£

ÔÚ¿ªÆªÌáµ½¹ýÏ̳߳صÄÓŵãÊÇ¿É×ܽáΪÒÔÏÂÈýµã£º

Ï̸߳´ÓÃ

¿ØÖÆ×î´ó²¢·¢Êý

¹ÜÀíÏß³Ì

1.Ï̸߳´Óùý³Ì

Àí½âÏ̸߳´ÓÃÔ­ÀíÊ×ÏÈÓ¦Á˽âÏß³ÌÉúÃüÖÜÆÚ¡£

ÔÚÏ̵߳ÄÉúÃüÖÜÆÚÖУ¬ËüÒª¾­¹ýн¨(New)¡¢¾ÍÐ÷£¨Runnable£©¡¢ÔËÐУ¨Running£©¡¢×èÈû(Blocked)ºÍËÀÍö(Dead)5ÖÖ״̬¡£

Threadͨ¹ýnewÀ´Ð½¨Ò»¸öỊ̈߳¬Õâ¸ö¹ý³ÌÊÇÊdzõʼ»¯Ò»Ð©Ïß³ÌÐÅÏ¢£¬ÈçÏß³ÌÃû£¬id,Ïß³ÌËùÊôgroupµÈ£¬¿ÉÒÔÈÏΪֻÊǸöÆÕͨµÄ¶ÔÏó¡£µ÷ÓÃThreadµÄstart()ºóJavaÐéÄâ»ú»áΪÆä´´½¨·½·¨µ÷ÓÃÕ»ºÍ³ÌÐò¼ÆÊýÆ÷£¬Í¬Ê±½«hasBeenStartedΪtrue,Ö®ºóµ÷ÓÃstart·½·¨¾Í»áÓÐÒì³£¡£

´¦ÓÚÕâ¸ö״̬ÖеÄÏ̲߳¢Ã»ÓпªÊ¼ÔËÐУ¬Ö»ÊDZíʾ¸ÃÏ߳̿ÉÒÔÔËÐÐÁË¡£ÖÁÓÚ¸ÃÏ̺߳Îʱ¿ªÊ¼ÔËÐУ¬È¡¾öÓÚJVMÀïÏ̵߳÷¶ÈÆ÷µÄµ÷¶È¡£µ±Ï̻߳ñÈ¡cpuºó£¬run()·½·¨»á±»µ÷Óᣲ»Òª×Ô¼ºÈ¥µ÷ÓÃThreadµÄrun()·½·¨¡£Ö®ºó¸ù¾ÝCPUµÄµ÷¶ÈÔÚ¾ÍÐ÷¡ª¡ªÔËÐСª¡ª×èÈû¼äÇл»£¬Ö±µ½run()·½·¨½áÊø»òÆäËû·½Ê½Í£Ö¹Ị̈߳¬½øÈëdead״̬¡£

ËùÒÔʵÏÖÏ̸߳´ÓõÄÔ­ÀíÓ¦¸Ã¾ÍÊÇÒª±£³ÖÏ̴߳¦ÓÚ´æ»î״̬£¨¾ÍÐ÷£¬ÔËÐлò×èÈû£©¡£½ÓÏÂÀ´À´¿´ÏÂThreadPoolExecutorÊÇÔõôʵÏÖÏ̸߳´Óõġ£

ÔÚThreadPoolExecutorÖ÷ÒªWorkerÀàÀ´¿ØÖÆÏ̵߳ĸ´Ó᣿´ÏÂWorkerÀà¼ò»¯ºóµÄ´úÂ룬ÕâÑù·½±ãÀí½â£º

private final class Worker implements Runnable {

final Thread thread;

Runnable firstTask;

Worker(Runnable firstTask) {
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}

public void run() {
runWorker(this);
}

final void runWorker(Worker w) {
Runnable task = w.firstTask;
w.firstTask = null;
while (task != null || (task = getTask()) != null){
task.run();
}
}

WorkerÊÇÒ»¸öRunnable£¬Í¬Ê±ÓµÓÐÒ»¸öthread£¬Õâ¸öthread¾ÍÊÇÒª¿ªÆôµÄỊ̈߳¬ÔÚн¨Worker¶ÔÏóʱͬʱн¨Ò»¸öThread¶ÔÏó£¬Í¬Ê±½«Worker×Ô¼º×÷Ϊ²ÎÊý´«ÈëTThread£¬ÕâÑùµ±ThreadµÄstart()·½·¨µ÷ÓÃʱ£¬ÔËÐеÄʵ¼ÊÉÏÊÇWorkerµÄrun()·½·¨£¬½Ó×ŵ½runWorker()ÖÐ,ÓиöwhileÑ­»·£¬Ò»Ö±´ÓgetTask()ÀïµÃµ½Runnable¶ÔÏó£¬Ë³ÐòÖ´ÐС£getTask()ÓÖÊÇÔõôµÃµ½Runnable¶ÔÏóµÄÄØ£¿

ÒÀ¾ÉÊǼò»¯ºóµÄ´úÂ룺

private Runnable getTask() {
if(Ò»Ð©ÌØÊâÇé¿ö) {
return null;
}

Runnable r = workQueue.take();

return r;
}

Õâ¸öworkQueue¾ÍÊdzõʼ»¯ThreadPoolExecutorʱ´æ·ÅÈÎÎñµÄBlockingQueue¶ÓÁУ¬Õâ¸ö¶ÓÁÐÀïµÄ´æ·ÅµÄ¶¼Êǽ«ÒªÖ´ÐеÄRunnableÈÎÎñ¡£ÒòΪBlockingQueueÊǸö×èÈû¶ÓÁУ¬BlockingQueue.take()µÃµ½Èç¹ûÊǿգ¬Ôò½øÈëµÈ´ý״ֱ̬µ½BlockingQueueÓÐеĶÔÏó±»¼ÓÈëʱ»½ÐÑ×èÈûµÄÏ̡߳£ËùÒÔÒ»°ãÇé¿öThreadµÄrun()·½·¨¾Í²»»á½áÊø,¶øÊDz»¶ÏÖ´ÐдÓworkQueueÀïµÄRunnableÈÎÎñ£¬Õâ¾Í´ïµ½ÁËÏ̸߳´ÓõÄÔ­ÀíÁË¡£

2.¿ØÖÆ×î´ó²¢·¢Êý

ÄÇRunnableÊÇʲôʱºò·ÅÈëworkQueue£¿WorkerÓÖÊÇʲôʱºò´´½¨£¬WorkerÀïµÄThreadµÄÓÖÊÇʲôʱºòµ÷ÓÃstart()¿ªÆôÐÂÏß³ÌÀ´Ö´ÐÐWorkerµÄrun()·½·¨µÄÄØ£¿ÓÐÉÏÃæµÄ·ÖÎö¿´³öWorkerÀïµÄrunWorker()Ö´ÐÐÈÎÎñʱÊÇÒ»¸ö½ÓÒ»¸ö£¬´®ÐнøÐеģ¬ÄDz¢·¢ÊÇÔõôÌåÏÖµÄÄØ£¿

ºÜÈÝÒ×Ïëµ½ÊÇÔÚexecute(Runnable runnable)ʱ»á×öÉÏÃæµÄһЩÈÎÎñ¡£¿´ÏÂexecuteÀïÊÇÔõô×öµÄ¡£

execute:

¼ò»¯ºóµÄ´úÂë

public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();

int c = ctl.get();
// µ±Ç°Ïß³ÌÊý < corePoolSize
if (workerCountOf(c) < corePoolSize) {
// Ö±½ÓÆô¶¯ÐµÄÏ̡߳£
if (addWorker(command, true))
return;
c = ctl.get();
}

// »î¶¯Ïß³ÌÊý >= corePoolSize
// runStateΪRUNNING && ¶ÓÁÐδÂú
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
// ÔٴμìÑéÊÇ·ñΪRUNNING״̬
// ·ÇRUNNING״̬ Ôò´ÓworkQueueÖÐÒÆ³ýÈÎÎñ²¢¾Ü¾ø
if (!isRunning(recheck) && remove(command))
reject(command);// ²ÉÓÃÏ̳߳ØÖ¸¶¨µÄ²ßÂԾܾøÈÎÎñ
// Á½ÖÖÇé¿ö£º
// 1.·ÇRUNNING״̬¾Ü¾øÐµÄÈÎÎñ
// 2.¶ÓÁÐÂúÁËÆô¶¯ÐµÄÏß³Ìʧ°Ü£¨workCount > maximumPoolSize£©
} else if (!addWorker(command, false))
reject(command);
}

addWorker:

¼ò»¯ºóµÄ´úÂë

private boolean addWorker(Runnable firstTask, boolean core) {

int wc = workerCountOf(c);
if (wc >= (core ? corePoolSize : maximumPoolSize)) {
return false;
}

w = new Worker(firstTask);
final Thread t = w.thread;
t.start();
}

¸ù¾Ý´úÂëÔÙÀ´¿´ÉÏÃæÌáµ½µÄÏ̳߳ع¤×÷¹ý³ÌÖеÄÌí¼ÓÈÎÎñµÄÇé¿ö£º

* Èç¹ûÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿Ð¡ÓÚ corePoolSize£¬ÄÇôÂíÉÏ´´½¨Ïß³ÌÔËÐÐÕâ¸öÈÎÎñ£»   
* Èç¹ûÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿´óÓÚ»òµÈÓÚ corePoolSize£¬ÄÇô½«Õâ¸öÈÎÎñ·ÅÈë¶ÓÁУ»
* Èç¹ûÕâʱºò¶ÓÁÐÂúÁË£¬¶øÇÒÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿Ð¡ÓÚ maximumPoolSize£¬ÄÇô»¹ÊÇÒª´´½¨·ÇºËÐÄÏß³ÌÁ¢¿ÌÔËÐÐÕâ¸öÈÎÎñ£»
* Èç¹û¶ÓÁÐÂúÁË£¬¶øÇÒÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿´óÓÚ»òµÈÓÚ maximumPoolSize£¬ÄÇôÏ̳߳ػáÅ׳öÒì³£RejectExecutionException¡£

Õâ¾ÍÊÇAndroidµÄAsyncTaskÔÚ²¢ÐÐÖ´ÐÐÊÇÔÚ³¬³ö×î´óÈÎÎñÊýÊÇÅ׳öRejectExecutionExceptionµÄÔ­ÒòËùÔÚ£¬Ïê¼û»ùÓÚ×îа汾µÄAsyncTaskÔ´Âë½â¶Á¼°AsyncTaskµÄºÚ°µÃæ

ͨ¹ýaddWorkerÈç¹û³É¹¦´´½¨ÐµÄÏ̳߳ɹ¦£¬Ôòͨ¹ýstart()¿ªÆôÐÂỊ̈߳¬Í¬Ê±½«firstTask×÷ΪÕâ¸öWorkerÀïµÄrun()ÖÐÖ´ÐеĵÚÒ»¸öÈÎÎñ¡£

ËäȻÿ¸öWorkerµÄÈÎÎñÊÇ´®Ðд¦Àí£¬µ«Èç¹û´´½¨Á˶à¸öWorker£¬ÒòΪ¹²ÓÃÒ»¸öworkQueue£¬ËùÒԾͻᲢÐд¦ÀíÁË¡£

ËùÒÔ¸ù¾ÝcorePoolSizeºÍmaximumPoolSizeÀ´¿ØÖÆ×î´ó²¢·¢Êý¡£´óÖ¹ý³Ì¿ÉÓÃÏÂͼ±íʾ¡£

ÉÏÃæµÄ½²½âºÍͼÀ´¿ÉÒԺܺõÄÀí½âµÄÕâ¸ö¹ý³Ì¡£

Èç¹ûÊÇ×öAndroid¿ª·¢µÄ£¬²¢ÇÒ¶ÔHandlerÔ­Àí±È½ÏÊìϤ£¬Äã¿ÉÄÜ»á¾õµÃÕâ¸öͼͦÊìϤ£¬ÆäÖеÄһЩ¹ý³ÌºÍHandler£¬Looper£¬MeaasgeʹÓÃÖУ¬ºÜÏàËÆ¡£Handler.send(Message)Ï൱ÓÚexecute(Runnuble)£¬LooperÖÐά»¤µÄMeaasge¶ÓÁÐÏ൱ÓÚBlockingQueue£¬Ö»²»¹ýÐèÒª×Ô¼ºÍ¨¹ýͬ²½À´Î¬»¤Õâ¸ö¶ÓÁУ¬LooperÖеÄloop()º¯ÊýÑ­»·´ÓMeaasge¶ÓÁÐÈ¡MeaasgeºÍWorkerÖеÄrunWork()²»¶Ï´ÓBlockingQueueÈ¡RunnableÊÇͬÑùµÄµÀÀí¡£

3.¹ÜÀíÏß³Ì

ͨ¹ýÏ̳߳ؿÉÒԺܺõĹÜÀíÏ̵߳ĸ´Ó㬿ØÖƲ¢·¢Êý£¬ÒÔ¼°Ïú»ÙµÈ¹ý³Ì,Ï̵߳ĸ´ÓúͿØÖƲ¢·¢ÉÏÃæÒѾ­½²ÁË£¬¶øÏ̵߳ĹÜÀí¹ý³ÌÒѾ­´©²åÔÚÆäÖÐÁË£¬Ò²ºÜºÃÀí½â¡£

ÔÚThreadPoolExecutorÓиöctlµÄAtomicInteger±äÁ¿¡£Í¨¹ýÕâÒ»¸ö±äÁ¿±£´æÁËÁ½¸öÄÚÈÝ£º

ËùÓÐÏ̵߳ÄÊýÁ¿ ÿ¸öÏß³ÌËù´¦µÄ״̬ ÆäÖеÍ29λ´æÏß³ÌÊý£¬¸ß3λ´ærunState£¬Í¨¹ýλÔËËãÀ´µÃµ½²»Í¬µÄÖµ¡£

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

//µÃµ½Ï̵߳Ä״̬
private static int runStateOf(int c) {
return c & ~CAPACITY;
}

//µÃµ½WorkerµÄµÄÊýÁ¿
private static int workerCountOf(int c) {
return c & CAPACITY;
}

// ÅжÏÏß³ÌÊÇ·ñÔÚÔËÐÐ
private static boolean isRunning(int c) {
return c < SHUTDOWN;
}

ÕâÀïÖ÷Ҫͨ¹ýshutdownºÍshutdownNow()À´·ÖÎöÏ̳߳صĹرչý³Ì¡£Ê×ÏÈÏ̳߳ØÓÐÎåÖÖ״̬À´¿ØÖÆÈÎÎñÌí¼ÓÓëÖ´ÐС£Ö÷Òª½éÉÜÒÔÏÂÈýÖÖ£º

RUNNING״̬£ºÏ̳߳ØÕý³£ÔËÐУ¬¿ÉÒÔ½ÓÊÜеÄÈÎÎñ²¢´¦Àí¶ÓÁÐÖеÄÈÎÎñ£»

SHUTDOWN״̬£º²»ÔÙ½ÓÊÜеÄÈÎÎñ£¬µ«ÊÇ»áÖ´ÐжÓÁÐÖеÄÈÎÎñ£»

STOP״̬£º²»ÔÙ½ÓÊÜÐÂÈÎÎñ£¬²»´¦Àí¶ÓÁÐÖеÄÈÎÎñ shutdownÕâ¸ö·½·¨»á½«runStateÖÃΪSHUTDOWN£¬»áÖÕÖ¹ËùÓпÕÏеÄỊ̈߳¬¶øÈÔÔÚ¹¤×÷µÄÏ̲߳»ÊÜÓ°Ï죬ËùÒÔ¶ÓÁÐÖеÄÈÎÎñÈ˻ᱻִÐС£

shutdownNow·½·¨½«runStateÖÃΪSTOP¡£ºÍshutdown·½·¨µÄÇø±ð£¬Õâ¸ö·½·¨»áÖÕÖ¹ËùÓеÄỊ̈߳¬ËùÒÔ¶ÓÁÐÖеÄÈÎÎñÒ²²»»á±»Ö´ÐÐÁË¡£

×ܽá

ͨ¹ý¶ÔThreadPoolExecutorÔ´ÂëµÄ·ÖÎö£¬´Ó×ÜÌåÉÏÁ˽âÁËÏ̳߳صĴ´½¨£¬ÈÎÎñµÄÌí¼Ó£¬Ö´Ðеȹý³Ì£¬ÊìϤÕâЩ¹ý³Ì£¬Ê¹ÓÃÏ̳߳ؾͻá¸üÇáËÉÁË¡£

¶ø´ÓÖÐѧµ½µÄһЩ¶Ô²¢·¢¿ØÖÆ£¬ÒÔ¼°Éú²úÕß¡ª¡ªÏû·ÑÕßÄ£ÐÍÈÎÎñ´¦ÀíµÄʹÓ㬶ÔÒÔºóÀí½â»ò½â¾öÆäËûÏà¹ØÎÊÌâ»áÓкܴóµÄ°ïÖú¡£±ÈÈçAndroidÖеÄHandler»úÖÆ£¬¶øLooperÖеÄMessager¶ÓÁÐÓÃÒ»¸öBlookQueueÀ´´¦ÀíͬÑùÊÇ¿ÉÒÔµÄ,Õâд¾ÍÊǶÁÔ´ÂëµÄÊÕ»ñ°É¡£

 

   
1767 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ