µ±Ç°Î»ÖãºÖ÷Ò³ > ²é¿´ÄÚÈÝ

Ò»ÎĶÁ¶®Ï̳߳صÄʵÏÖÔ­Àí

·¢²¼Ê±¼ä£º2021-08-16 00:00| ÓРλÅóÓѲ鿴

¼ò½é£º»¶Ó­´ó¼Ò¹Ø×¢ÎÒµÄ΢ÐŹ«Öںš¾ ÀÏÖÜÁļܹ¹ ¡¿Javaºó¶ËÖ÷Á÷¼¼ÊõÕ»µÄÔ­Àí¡¢Ô´Âë·ÖÎö¡¢¼Ü¹¹ÒÔ¼°¸÷ÖÖ»¥ÁªÍø¸ß²¢·¢¡¢¸ßÐÔÄÜ¡¢¸ß¿ÉÓõĽâ¾ö·½°¸¡£ Ò»¡¢Ç°ÑÔ ÉϸöÔµ×ȺÀïµÄÒ»¸öºÃÅóÓÑÏòÀÏÖÜÌá³öɶʱºò·ÖÏí ThreadPoolExecutor ½âÎö´óÈ«ÎÒ˵ºóÃæ»áÌáÉÏÈÕ³ÌÈ»ºóǰЩ¡­¡­

»¶Ó­´ó¼Ò¹Ø×¢ÎÒµÄ΢ÐŹ«Öںš¾ÀÏÖÜÁļܹ¹¡¿,Javaºó¶ËÖ÷Á÷¼¼ÊõÕ»µÄÔ­Àí¡¢Ô´Âë·ÖÎö¡¢¼Ü¹¹ÒÔ¼°¸÷ÖÖ»¥ÁªÍø¸ß²¢·¢¡¢¸ßÐÔÄÜ¡¢¸ß¿ÉÓõĽâ¾ö·½°¸¡£

Ò»¡¢Ç°ÑÔ

ÉϸöÔµ×ȺÀïµÄÒ»¸öºÃÅóÓÑÏòÀÏÖÜÌá³öɶʱºò·ÖÏí ThreadPoolExecutor ½âÎö´óÈ«,ÎÒ˵ºóÃæ»áÌáÉÏÈÕ³Ì;È»ºóǰЩÌìÓжÁÕßÒ²·´À¡ËµÔÚÃæÊÔÖÐÓб»Îʵ½Ï̳߳Ø,ÎÊÎÒɶʱºò³öһƪÏ̳߳ØÏà¹ØµÄÎÄÕ¡£½ñÌìÀÏÖܾÍÀ´°²ÅÅÒ»²¨Ï̳߳Ø,ÏÖÔںܶ๫˾¶¼Ï²»¶ÎÊÏ̳߳ØÏà¹ØµÄÃæÊÔÌâ,ΪʲôÃæÊÔ¹ÙÕâôÈÈÖÔÓÚÎÊÏ̳߳ØÏà¹ØµÄÃæÊÔÌâÄØ?ÒòΪÕâÊǶàÏ̵߳Ļù´¡,ThreadPoolExecutor µÄ¼¸¸öÖØÒª²ÎÊýÄã±ØÐë»áÖªµÀÉèÖÃÒÔ¼°Ê²Ã´³¡¾°Ñ¡ÔñÄÄÖÖ Executor ¡¢Ï̳߳ضÓÁеÄÑ¡ÔñÒÔ¼°ÏàÓ¦µÄ¾Ü¾ø²ßÂÔ¡£

ÏÂÃæÀÏÖÜÊÕ¼¯Á˼¸¸öÅóÓÑÌṩµÄ´ó³§¹ØÓÚÏ̳߳صÄÃæÊÔÌâ:

  • Ï̳߳صÄʹÓó¡¾°
  • Ï̳߳ظ÷¸ö²ÎÊýµÄº¬Òå,ÄãƽʱÓõÄʲô¶ÓÁÐÒÔ¼°¾Ü¾ø²ßÂÔ?
  • ³ÌÐòÖÐÄÄЩµØ·½Óõ½ÁËÏ̳߳Ø,ÓÃÏ̳߳صĺô¦ÓÐÄÄЩ?
  • ÈçºÎ×Ô¼ºÊµÏÖÒ»¸öÏ̳߳Ø
  • JDK ÌṩÁËÄÄЩÏ̳߳صÄĬÈÏʵÏÖ
  • °¢Àï°Í°Í Java ¿ª·¢ÊÖ²áΪɶ²»ÔÊÐíĬÈÏʵÏÖµÄÏ̳߳Ø
  • Ï̳߳ØÀïµÄ²ÎÊýÄãÊÇÔõôµÃ³öÀ´µÄ,¸ù¾ÝʲôËã³öÀ´µÄ?
  • ˵˵Äã×Ô¶¨ÒåÏ̳߳ØÀïµÄ¹¤×÷Á÷³Ì
  • ¡­

ÕâÀïÀÏÖܾͲ»´ø´ó¼ÒÒ»¸ö¸ö¶ÔÃæÊÔÌâ½øÐзÖÎöÁË,ÕâÀï¶ÔÖ»½²ºËÐÄÔ­ÀíÔÙ½áºÏ¶¯Ì¬µ÷ÕûÏ̳߳زÎÊýµÄʵ¼ùÀ´°ïÖúÄã¶ÔÏ̳߳ØÓиöÇåÎúµÄÈÏʶ,ÖªµÀÁËÔ­ÀíÔÙ½áºÏ×Ô¼ºµÄʵ¼ù,ÄÇÃæÊÔÏ̳߳ØÒ²ÊǵÃÐÄÓ¦ÊÖÁË¡£ÄÇÄãÓпÉÄÜÎÊ,ÀÏÖÜ°¡,ÎÒƽʱҲûÓõ½Ï̳߳ذ¡,ÓõÄÒ²¶¼ÊǶ¨ÒåÀà¼Ì³Ð ThreadÀà »òÕß ¶¨ÒåÀàʵÏÖ Runnable ½Ó¿ÚÀ´ÊµÏÖ¶àÏ̵߳İ¡¡£¶î,Èç¹ûÄãÊÇÃæµÄ Java Öи߼¶¿ª·¢,ÄÇÄãǧÍò²»ÒªÕâÑù˵,Õâ»áÈÃÃæÊÔ¹ÙһϾõµÃÄã²»ÖµÖи߼¶¡£Èç¹ûÄãÃæµÄÖи߼¶»¹²»ÖªµÀÏ̳߳صĻ°Ò²Ã»¹Øϵ,ÐÒºÃÄã¿´µ½ÁËÀÏÖÜÕâƪÎÄÕÂ,»¹²»ËãÍí;Èç¹ûÄãÊÇÒѾ­ÓùýÏ̳߳ØÏà¹Ø,ÄÇÕâƪÎÄÕÂÒ²»áÈÃÄã¶ÔÏ̳߳صÄÔ­Àí¸ü¼ÓÇå³þ,ÔÚÏîÄ¿ÖÐÓ¦ÓÃÒ²»áµÃÐÄÓ¦ÊÖ¡£

¶þ¡¢Ï̳߳صĸÅÄî

2.1 Ï̳߳ØÊÇʲô

Ï̳߳ØÊÇÒ»ÖÖÏß³ÌʹÓÃģʽ¡£Ï̹߳ý¶à»á´øÀ´¶îÍâµÄ¿ªÏú,ÆäÖаüÀ¨´´½¨Ïú»ÙÏ̵߳ĿªÏú¡¢µ÷¶ÈÏ̵߳ĿªÏúµÈµÈ,ͬʱҲ½µµÍÁ˼ÆËã»úµÄÕûÌåÐÔÄÜ¡£Ï̳߳Øά»¤¶à¸öÏß³Ì,µÈ´ý¼à¶½¹ÜÀíÕß·ÖÅä¿É²¢·¢Ö´ÐеÄÈÎÎñ¡£ÕâÖÖ×ö·¨,Ò»·½Ãæ±ÜÃâÁË´¦ÀíÈÎÎñʱ´´½¨Ïú»ÙÏ߳̿ªÏúµÄ´ú¼Û,ÁíÒ»·½Ãæ±ÜÃâÁËÏß³ÌÊýÁ¿ÅòÕ͵¼ÖµĹý·Öµ÷¶ÈÎÊÌâ,±£Ö¤Á˶ÔÄں˵ijä·ÖÀûÓá£

2.2 ʹÓÃÏ̳߳صĺô¦

  • ½µµÍ×ÊÔ´ÏûºÄ:ͨ¹ý³Ø»¯¼¼ÊõÖظ´ÀûÓÃÒÑ´´½¨µÄÏß³Ì,½µµÍÏ̴߳´½¨ºÍÏú»ÙÔì³ÉµÄËðºÄ¡£
  • Ìá¸ßÏìÓ¦ËÙ¶È:ÈÎÎñµ½´ïʱ,ÎÞÐèµÈ´ýÏ̴߳´½¨¼´¿ÉÁ¢¼´Ö´ÐС£
  • Ìá¸ßÏ̵߳ĿɹÜÀíÐÔ:Ïß³ÌÊÇϡȱ×ÊÔ´,Èç¹ûÎÞÏÞÖÆ´´½¨,²»½ö»áÏûºÄϵͳ×ÊÔ´,»¹»áÒòΪÏ̵߳IJ»ºÏÀí·Ö²¼µ¼ÖÂ×ÊÔ´µ÷¶Èʧºâ,½µµÍϵͳµÄÎȶ¨ÐÔ¡£Ê¹ÓÃÏ̳߳ؿÉÒÔ½øÐÐͳһµÄ·ÖÅä¡¢µ÷Óźͼà¿Ø¡£
  • Ìṩ¸ü¶à¸üÇ¿´óµÄ¹¦ÄÜ:Ï̳߳ؾ߱¸¿ÉÍØÕ¹ÐÔ,ÔÊÐí¿ª·¢ÈËÔ±ÏòÆäÖÐÔö¼Ó¸ü¶àµÄ¹¦ÄÜ¡£±ÈÈçÑÓʱ¶¨Ê±Ïß³Ì³Ø ScheduledThreadPoolExecutor,¾ÍÔÊÐíÈÎÎñÑÓÆÚÖ´Ðлò¶¨ÆÚÖ´ÐС£

2.3¡¢ThreadPoolExecutor µÄºËÐIJÎÊý

ÍøÉÏ˵µÄÌ컨ÂÒ×¹µÄ,Ò²²»ÈçÖ±½Ó¿´ Doug Lea ´óÀÐÔ´ÂëµÄ×¢ÊÍÀ´µÄ¸ü¼ÓÌùÇÐЩ¡£
ÔÚÕâÀï²åÈëͼƬÃèÊö

  • corePoolSize:the number of threads to keep in the pool, even if they are idle, unless {@code allowCoreThreadTimeOut} is set
    ºËÐÄÏß³ÌÊý:Ï̳߳ØÖб£ÁôµÄÏß³ÌÊý,¼´Ê¹ËüÃÇÊÇ¿ÕÏеÄ,³ý·ÇÉèÖà allowCoreThreadTimeOut¡£

  • maximumPoolSize:the maximum number of threads to allow in the pool
    ×î´óÏß³ÌÊý:Ï̳߳ØÖÐÔÊÐíµÄ×î´óÏß³ÌÊý

  • keepAliveTime:when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
    Ï߳̿ÕÏÐʱ¼ä:Èç¹û¾­¹ý keepAliveTime ʱ¼äºó,³¬¹ýºËÐÄÏß³ÌÊýµÄÏ̻߳¹Ã»ÓнÓÊܵ½ÐµÄÈÎÎñ,ÄǾͻØÊÕ¡£

  • unit:the time unit for the {@code keepAliveTime} argument
    µ¥Î»:keepAliveTime µÄʱ¼äµ¥Î»

  • workQueue:the queue to use for holding tasks before they are executed. This queue will hold only the {@code Runnable} tasks submitted by the {@code execute} method.
    ´æ·Å´ýÖ´ÐÐÈÎÎñµÄ¶ÓÁÐ:µ±Ìá½»µÄÈÎÎñÊý³¬¹ýºËÐÄÏß³ÌÊýºó,ÔÙÌá½»µÄÈÎÎñ¾Í´æ·ÅÔÚÕâÀï¡£Ëü½ö½öÓÃÀ´´æ·Å±» execute ·½·¨Ìá½»µÄ Runnable ÈÎÎñ¡£(ÕâÀï²»ÒªÔÙ·­Òë³É¹¤×÷¶ÓÁÐÁ˺ÃÂð)

  • threadFactory:the factory to use when the executor creates a new thread
    Ï̹߳¤³§:Ö´ÐгÌÐò´´½¨ÐÂÏß³ÌʱʹÓõŤ³§¡£±ÈÈçÎÒÃÇÏîÄ¿ÖÐ×Ô¶¨ÒåµÄÏ̹߳¤³§,ÅŲéÎÊÌâµÄʱºò,¸ù¾ÝÏ̹߳¤³§µÄÃû³Æ¾ÍÖªµÀÕâ¸öÏß³ÌÀ´×ÔÄÄÀï,ºÜ¿ìµÄ¶¨Î»³öÎÊÌâ,

  • handler :the handler to use when execution is blocked because the thread bounds and queue capacities are reached
    ¾Ü¾ø²ßÂÔ:µ±¶ÓÁÐÀïÃæ·ÅÂúÁËÈÎÎñ¡¢×î´óÏß³ÌÊýµÄÏ̶߳¼ÔÚ¹¤×÷ʱ,Õâʱ¼ÌÐøÌá½»µÄÈÎÎñÏ̳߳ؾʹ¦Àí²»ÁË,Ó¦¸ÃÖ´ÐÐÔõôÑùµÄ¾Ü¾ø²ßÂÔ¡£

Èý¡¢Ï̳߳صÄʵÏÖÔ­Àí

±¾ÎÄÃèÊöÏ̳߳ØÊÇ JDK 8 ÖÐÌṩµÄ ThreadPoolExecutor Àà,ÄÇÎÒÃÇ¾Í´Ó ThreadPoolExecutor ÀàÀ´¿´ÏÂËüµÄ UML ÒÀÀµ¹Øϵ¡£

3.1 ×ÜÌåÉè¼Æ

ÔÚÕâÀï²åÈëͼƬÃèÊö

  • À¶É«ÊµÏß:¼Ì³Ð¹Øϵ
  • ÂÌÉ«ÐéÏß:½Ó¿ÚʵÏÖ¹Øϵ
  • ÂÌɫʵÏÖ:½Ó¿Ú¼Ì³Ð¹Øϵ

ThreadPoolExecutor ʵÏֵĶ¥²ã½Ó¿ÚÊÇ Executor,¶¥²ã½Ó¿ÚÖ»ÌṩÁËvoid execute(Runnable command); Õâôһ¸ö·½·¨,Executor ÌṩµÄÊÇÒ»ÖÖ˼Ïë:½«ÈÎÎñÌá½»ºÍÈÎÎñÖ´ÐнøÐнâñî¡£Óû§ÎÞÐè¹Ø×¢ÈçºÎ´´½¨Ïß³Ì,ÈçºÎµ÷¶ÈÏß³ÌÀ´Ö´ÐÐÈÎÎñ,Óû§Ö»ÐèÌṩ Runnable ¶ÔÏó,½«ÈÎÎñµÄÔËÐÐÂß¼­Ìá½»µ½Ö´ÐÐÆ÷(Executor)ÖÐ,ÓÉ Executor ¿ò¼ÜÍê³ÉÏ̵߳ĵ÷ÅäºÍÈÎÎñµÄÖ´Ðв¿·Ö¡£

ExecutorService ½Ó¿ÚÔö¼ÓÁËһЩÄÜÁ¦:

  • À©³äÖ´ÐÐÈÎÎñµÄÄÜÁ¦,²¹³ä¿ÉÒÔΪһ¸ö»òÒ»ÅúÒì²½ÈÎÎñÉú³É Future µÄ·½·¨;
  • ÌṩÁ˹ܿØÏ̳߳صķ½·¨,±ÈÈçÍ£Ö¹Ï̳߳صÄÔËÐС£

AbstractExecutorService ÔòÊÇÉϲãµÄ³éÏóÀà,½«Ö´ÐÐÈÎÎñµÄÁ÷³Ì´®ÁªÁËÆðÀ´,±£Ö¤Ï²ãµÄʵÏÖÖ»Ðè¹Ø×¢Ò»¸öÖ´ÐÐÈÎÎñµÄ·½·¨¼´¿É¡£×îϲãµÄʵÏÖÀà ThreadPoolExecutor ʵÏÖ×ÔÓµÄÔËÐв¿·Ö,ThreadPoolExecutor ½«»áÒ»·½Ãæά»¤×ÔÉíµÄÉúÃüÖÜÆÚ,ÁíÒ»·½Ãæͬʱ¹ÜÀíÏ̺߳ÍÈÎÎñ,ʹÁ½ÕßÁ¼ºÃµÄ½áºÏ´Ó¶øÖ´Ðв¢ÐÐÈÎÎñ¡£

ÎÒÃÇÀ´¿´Ï ThreadPoolExecutor µÄÔËÐÐÁ÷³Ì:

ÔÚÕâÀï²åÈëͼƬÃèÊö
Ï̳߳ØÔÚÄÚ²¿Êµ¼ÊÉϹ¹½¨ÁËÒ»¸öÉú²úÕßÏû·ÑÕßÄ£ÐÍ,½«Ï̺߳ÍÈÎÎñÁ½Õß½âñî,²¢²»Ö±½Ó¹ØÁª,´Ó¶øÁ¼ºÃµÄ»º³åÈÎÎñ,¸´ÓÃÏ̡߳£Ï̳߳صÄÔËÐÐÖ÷Òª·Ö³ÉÁ½²¿·Ö:ÈÎÎñ¹ÜÀí¡¢Ï̹߳ÜÀí¡£

ÈÎÎñ¹ÜÀí²¿·Ö³äµ±Éú²úÕߵĽÇÉ«,µ±ÈÎÎñÌá½»ºó,Ï̳߳ػáÅжϸÃÈÎÎñºóÐøµÄÁ÷ת:

  • Ö±½ÓÉêÇëÏß³ÌÖ´ÐиÃÈÎÎñ
  • »º³åµ½¶ÓÁÐÖеȴýÏß³ÌÖ´ÐÐ
  • ¾Ü¾ø¸ÃÈÎÎñ

Ï̹߳ÜÀí²¿·Ö³äµ±Ïû·ÑÕߵĽÇÉ«,ËüÃDZ»Í³Ò»Î¬»¤ÔÚÏ̳߳ØÄÚ,¸ù¾ÝÈÎÎñÇëÇó½øÐÐÏ̵߳ķÖÅä,µ±Ïß³ÌÖ´ÐÐÍêÈÎÎñºóÔò»á¼ÌÐø»ñȡеÄÈÎÎñÈ¥Ö´ÐÐ,×îÖÕµ±Ï̻߳ñÈ¡²»µ½ÈÎÎñµÄʱºò,Ï߳̾ͻᱻ»ØÊÕ¡£

ÏÂÃæ¾Í´ÓÒÔÏÂÈý¸öºËÐÄ»úÖÆÀ´Ïêϸ½²½âÏ̳߳ØÔËÐлúÖÆ:

  • Ï̳߳ØÈçºÎά»¤×ÔÉí״̬
  • Ï̳߳ØÈçºÎ¹ÜÀíÈÎÎñ
  • Ï̳߳ØÈçºÎ¹ÜÀíÏß³Ì

3.2 Ï̳߳ØÈçºÎά»¤×ÔÉí״̬

Ï̳߳ØÔËÐеÄ״̬,²¢²»ÊÇÓû§ÏÔʽÉèÖõÄ,¶øÊÇ°éËæ×ÅÏ̳߳صÄÔËÐÐ,ÓÉÄÚ²¿À´Î¬»¤¡£Ï̳߳ØÄÚ²¿Ê¹ÓÃÒ»¸ö±äÁ¿Î¬»¤Á½¸öÖµ:ÔËÐÐ״̬(runState)ºÍÏß³ÌÊýÁ¿(workerCount)¡£
ÔÚÕâÀï²åÈëͼƬÃèÊö

ctl Õâ¸ö AtomicInteger ÀàÐÍ,ÊǶÔÏ̳߳صÄÔËÐÐ״̬ºÍÏ̳߳ØÖÐÓÐЧÏ̵߳ÄÊýÁ¿½øÐпØÖƵÄÒ»¸ö×Ö¶Î, Ëüͬʱ°üº¬Á½²¿·ÖµÄÐÅÏ¢:Ï̳߳صÄÔËÐÐ״̬ (runState) ºÍÏ̳߳ØÄÚÓÐЧÏ̵߳ÄÊýÁ¿ (workerCount),¸ß 3 λ±£´æ runState,µÍ 29 λ±£´æ workerCount,Á½¸ö±äÁ¿Ö®¼ä»¥²»¸ÉÈÅ¡£ÓÃÒ»¸ö±äÁ¿È¥´æ´¢Á½¸öÖµ,¿É±ÜÃâÔÚ×öÏà¹Ø¾ö²ßʱ,³öÏÖ²»Ò»ÖµÄÇé¿ö,²»±ØΪÁËά»¤Á½ÕßµÄÒ»ÖÂ,¶øÕ¼ÓÃËø×ÊÔ´¡£Í¨¹ýÔĶÁÏ̳߳ØÔ´´úÂëÒ²¿ÉÒÔ·¢ÏÖ,¾­³£³öÏÖҪͬʱÅжÏÏ̳߳ØÔËÐÐ״̬ºÍÏß³ÌÊýÁ¿µÄÇé¿ö¡£Ï̳߳ØÒ²ÌṩÁËÈô¸É·½·¨È¥¹©Óû§»ñµÃÏ̳߳ص±Ç°µÄÔËÐÐ״̬¡¢Ï̸߳öÊý¡£ÕâÀﶼʹÓõÄÊÇλÔËËãµÄ·½Ê½,Ïà±ÈÓÚ»ù±¾ÔËËã,ËÙ¶ÈÒ²»á¿ìºÜ¶à¡£

¹ØÓÚÄÚ²¿·â×°µÄ»ñÈ¡ÉúÃüÖÜÆÚ״̬¡¢»ñÈ¡Ï̳߳ØÏß³ÌÊýÁ¿µÄ¼ÆËã·½·¨ÈçÏ´úÂë:
ÔÚÕâÀï²åÈëͼƬÃèÊö
ÍÛ,Doug Lea ´óÀмòÖ±ÁË,Éè¼ÆµÄÕæºÃ¡£ÀÏÖܵȵÈÎÒ,ÕâÀïÔõôÉè¼ÆµÄ¾ÍºÃÁË?CAPACITY ÕâÀïÊǶàÉÙѽ?

²»×ż±,ÀÏÖÜÕâ¾Í´øÄãÀ´·ÖÎö·ÖÎöΪʲôһ¸öÕûÐͱäÁ¿¼È¿ÉÒÔ±£´æÔËÐÐ״̬,ÓÖ¿ÉÒÔ±£´æÏß³ÌÊýÁ¿?

Ê×ÏÈ,ÎÒÃÇÖªµÀ Java ÖÐ 1 ¸öÕûÐÍÕ¼ 4 ¸ö×Ö½Ú,Ò²¾ÍÊÇ 32 λ,ËùÒÔ 1 ¸öÕûÐÍÓÐ 32 λ¡£

ËùÒÔÕûÐÍ 1 Óöþ½øÖƱíʾ¾ÍÊÇ:0000 0000 0000 0000 0000 0000 0000 0001

ÕûÐÍ -1 Óöþ½øÖƱíʾ¾ÍÊÇ:1111 1111 1111 1111 1111 1111 1111 1111 (Õâ¸öÊDz¹Âë,Õâ¸öÍüÁ˵Ļ°ÄǵÃÈ¥¸´Ï°ÏÂÔ­Âë¡¢·´Âë¡¢²¹ÂëµÈ¼ÆËã»ú»ù´¡ÖªÊ¶ÁË¡£)

ÔÚ ThreadPoolExecutor,ÕûÐÍÖÐ 32 λµÄÇ° 3 λÓÃÀ´±íʾÏ̳߳Ø״̬,ºó 29 λ±íʾÏ̳߳ØÖÐÓÐЧµÄÏß³ÌÊý¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö
ÕâÀïÄãÓпÉÄÜÎÊÁË,ÀÏÖÜ°¡,CAPACITY = (1 << 29) - 1 Ôõô¾ÍµÃµ½ 0001 1111 1111 1111 1111 1111 1111 1111¡£

ºÃ°É,ÀÏÖܾʹøÄã·ÖÎöÏ CAPACITY ÔõôÀ´µÄ,ÏÂÃæµÄÄÇЩ״̬´ó¼ÒÒ²¿ÉÒÔ×Ô¼ºÈ¥·ÖÎöϹþ¡£

ÎÒÃÇÏÈÀ´¿´ 1 << 29,Ê×ÏÈ¿´ 1 µÄ¶þ½øÖÆ´ú±í 0000 0000 0000 0000 0000 0000 0000 0001¡£

È»ºó 0000 0000 0000 0000 0000 0000 0000 0001 Ïò×óÒÆ 29 λ,µÃµ½ 0010 0000 0000 0000 0000 0000 0000 0000¡£

×îºó½« 0010 0000 0000 0000 0000 0000 0000 0000 ¼õ 1 µÃµ½ 0001 1111 1111 1111 1111 1111 1111 1111¡£

ÎÒÃÇÏÂÃæÔÙÀ´Á˽âÏ ThreadPoolExecutor Ëù¶¨ÒåµÄ״̬,ÕâЩ״̬¶¼ºÍÏ̵߳ÄÖ´ÐÐÃÜÇÐÏà¹Ø:

ÔÚÕâÀï²åÈëͼƬÃèÊö

  • RUNNING:ÄܽÓÊÜÐÂÌá½»µÄÈÎÎñ,²¢ÇÒÒ²ÄÜ´¦Àí×èÈû¶ÓÁÐÖеÄÈÎÎñ¡£
  • SHUTDOWN:Ö¸µ÷ÓÃÁË shutdown() ·½·¨,²»ÔÙ½ÓÊÜÐÂÌá½»µÄÈÎÎñ,µ«È´¿ÉÒÔ¼ÌÐø´¦Àí×èÈû¶ÓÁÐÖÐÒѱ£´æµÄÈÎÎñ¡£
  • STOP:Ö¸µ÷ÓÃÁË shutdownNow() ·½·¨,²»ÔÙ½ÓÊÜÐÂÌá½»µÄÈÎÎñ,ͬʱÅ×Æú×èÈû¶ÓÁÐÀïµÄËùÓÐÈÎÎñ²¢ÖжÏËùÓÐÕýÔÚÖ´ÐÐÈÎÎñ¡£
  • TIDYING: ËùÓÐÈÎÎñ¶¼Ö´ÐÐÍê±Ï,workerCount ÓÐЧÏß³ÌÊýΪ 0¡£
  • TERMINATED:ÖÕֹ״̬,µ±Ö´ÐÐ terminated() ºó»á¸üÐÂΪÕâ¸ö״̬¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö

3.3 Ï̳߳ØÈçºÎ¹ÜÀíÈÎÎñ

3.3.1 ÈÎÎñµ÷¶È

ÈÎÎñµ÷¶ÈÊÇÏ̳߳صÄÖ÷ÒªÈë¿Ú,µ±Óû§Ìá½»ÁËÒ»¸öÈÎÎñ,½ÓÏÂÀ´Õâ¸öÈÎÎñ½«ÈçºÎÖ´Ðж¼ÊÇÓÉÕâ¸ö½×¶Î¾ö¶¨µÄ¡£Á˽âÕⲿ·Ö¾ÍÏ൱ÓÚÁ˽âÁËÏ̳߳صĺËÐÄÔËÐлúÖÆ¡£

Ê×ÏÈ,ËùÓÐÈÎÎñµÄµ÷¶È¶¼ÊÇÓÉ execute ·½·¨Íê³ÉµÄ,±ÈÈçÎÒÃÇÒµÎñ´úÂëÖÐ
threadPool.execute(new Job());¡£

Õⲿ·ÖÍê³ÉµÄ¹¤×÷ÊÇ:¼ì²éÏÖÔÚÏ̳߳صÄÔËÐÐ״̬¡¢ÔËÐÐÏß³ÌÊý¡¢ÔËÐвßÂÔ,¾ö¶¨½ÓÏÂÀ´Ö´ÐеÄÁ÷³Ì,ÊÇÖ±½ÓÉêÇëÏß³ÌÖ´ÐÐ,»òÊÇ»º³åµ½¶ÓÁÐÖÐÖ´ÐÐ,Òà»òÊÇÖ±½Ó¾Ü¾ø¸ÃÈÎÎñ¡£ÆäÖ´Ðйý³ÌÈçÏÂ:

  • Ê×Ïȼì²âÏ̳߳ØÔËÐÐ״̬,Èç¹û²»ÊÇ RUNNING,ÔòÖ±½Ó¾Ü¾ø,Ï̳߳ØÒª±£Ö¤ÔÚ RUNNING µÄ״̬ÏÂÖ´ÐÐÈÎÎñ¡£
  • Èç¹û workerCount < corePoolSize,Ôò´´½¨²¢Æô¶¯Ò»¸öÏß³ÌÀ´Ö´ÐÐÐÂÌá½»µÄÈÎÎñ¡£
  • Èç¹û workerCount >= corePoolSize,ÇÒÏ̳߳ØÄÚµÄ×èÈû¶ÓÁÐδÂú,Ôò½«ÈÎÎñÌí¼Óµ½¸Ã×èÈû¶ÓÁÐÖС£
  • Èç¹û workerCount >= corePoolSize && workerCount < maximumPoolSize,ÇÒÏ̳߳ØÄÚµÄ×èÈû¶ÓÁÐÒÑÂú,Ôò´´½¨²¢Æô¶¯Ò»¸öÏß³ÌÀ´Ö´ÐÐÐÂÌá½»µÄÈÎÎñ¡£
  • Èç¹û workerCount >= maximumPoolSize,²¢ÇÒÏ̳߳ØÄÚµÄ×èÈû¶ÓÁÐÒÑÂú,Ôò¸ù¾Ý¾Ü¾ø²ßÂÔÀ´´¦Àí¸ÃÈÎÎñ,ĬÈϵĴ¦Àí·½Ê½ÊÇÖ±½ÓÅ×Òì³£¡£

Ö´ÐÐÁ÷³ÌͼÈçÏÂ:

ÔÚÕâÀï²åÈëͼƬÃèÊö
3.3.2 ´ýÖ´ÐÐÈÎÎñµÄ¶ÓÁÐ

´ýÖ´ÐÐÈÎÎñµÄ¶ÓÁÐÊÇÏ̳߳ØÄܹ»¹ÜÀíÈÎÎñµÄºËÐIJ¿·Ö¡£Ï̳߳صı¾ÖÊÊǶÔÈÎÎñºÍÏ̵߳ĹÜÀí,¶ø×öµ½ÕâÒ»µã×î¹Ø¼üµÄ˼Ïë¾ÍÊǽ«ÈÎÎñºÍÏß³ÌÁ½Õß½âñî,²»ÈÃÁ½ÕßÖ±½Ó¹ØÁª,²Å¿ÉÒÔ×öºóÐøµÄ·ÖÅ乤×÷¡£Ï̳߳ØÖÐÊÇÒÔÉú²úÕßÏû·ÑÕßģʽ,ͨ¹ýÒ»¸ö×èÈû¶ÓÁÐÀ´ÊµÏֵġ£×èÈû¶ÓÁлº´æÈÎÎñ,¹¤×÷Ï̴߳Ó×èÈû¶ÓÁÐÖлñÈ¡ÈÎÎñ¡£

×èÈû¶ÓÁÐ(BlockingQueue)ÊÇÒ»¸öÖ§³ÖÁ½¸ö¸½¼Ó²Ù×÷µÄ¶ÓÁС£

ÕâÁ½¸ö¸½¼ÓµÄ²Ù×÷ÊÇ:

  • ÔÚ¶ÓÁÐΪ¿Õʱ,»ñÈ¡ÔªËصÄÏ̻߳áµÈ´ý¶ÓÁбäΪ·Ç¿Õ¡£
  • µ±¶ÓÁÐÂúʱ,´æ´¢ÔªËصÄÏ̻߳áµÈ´ý¶ÓÁпÉÓá£

×èÈû¶ÓÁг£ÓÃÓÚÉú²úÕߺÍÏû·ÑÕߵij¡¾°,Éú²úÕßÊÇÍù¶ÓÁÐÀïÌí¼ÓÔªËصÄÏß³Ì,Ïû·ÑÕßÊÇ´Ó¶ÓÁÐÀïÄÃÔªËصÄÏ̡߳£×èÈû¶ÓÁоÍÊÇÉú²úÕß´æ·ÅÔªËصÄÈÝÆ÷,¶øÏû·ÑÕßÒ²Ö»´ÓÈÝÆ÷ÀïÄÃÔªËØ¡£

ÏÂͼÖÐչʾÁË Thread1 Íù×èÈû¶ÓÁÐÖÐÌí¼ÓÔªËØ,¶øÏß³Ì Thread2 ´Ó×èÈû¶ÓÁÐÖÐÒƳýÔªËØ:

ÔÚÕâÀï²åÈëͼƬÃèÊö
ʹÓò»Í¬µÄ¶ÓÁпÉÒÔʵÏÖ²»Ò»ÑùµÄÈÎÎñ´æÈ¡²ßÂÔ¡£ÎÒÃÇÏÂÃæÀ´¿´ÏÂ×èÈû¶ÓÁеijÉÔ±:

ÔÚÕâÀï²åÈëͼƬÃèÊö
3.3.3 ÈÎÎñÉêÇë

´ÓÉÏÎÄ¿ÉÖª,ÈÎÎñµÄÖ´ÐÐÓÐÁ½ÖÖ¿ÉÄÜ:

  • Ò»ÖÖÊÇÈÎÎñÖ±½ÓÓÉд´½¨µÄÏß³ÌÖ´ÐÐ
  • ÁíÒ»ÖÖÊÇÏ̴߳ÓÈÎÎñ¶ÓÁÐÖлñÈ¡ÈÎÎñÈ»ºóÖ´ÐÐ,Ö´ÐÐÍêÈÎÎñµÄ¿ÕÏÐÏ̻߳áÔÙ´ÎÈ¥´Ó¶ÓÁÐÖÐÉêÇëÈÎÎñÔÙÈ¥Ö´ÐС£

µÚÒ»ÖÖÇé¿ö½ö³öÏÖÔÚÏ̳߳õʼ´´½¨µÄʱºò,µÚ¶þÖÖÊÇÏ̻߳ñÈ¡ÈÎÎñ¾ø´ó¶àÊýµÄÇé¿ö¡£

Ïß³ÌÐèÒª´Ó´ýÖ´ÐÐÈÎÎñµÄ¶ÓÁÐÖв»¶ÏµØÈ¡ÈÎÎñÖ´ÐÐ,°ïÖúÏ̴߳Ó×èÈû¶ÓÁÐÖлñÈ¡ÈÎÎñ,ʵÏÖÏ̹߳ÜÀíÄ£¿éºÍÈÎÎñ¹ÜÀíÄ£¿éÖ®¼äµÄͨÐÅ¡£

Õⲿ·Ö²ßÂÔÓÉ getTask ·½·¨ÊµÏÖ,ÎÒÃÇÀ´¿´Ï getTask ·½·¨µÄ´úÂë¡£
ÔÚÕâÀï²åÈëͼƬÃèÊö
getTask ·½·¨ÔÚ×èÈû¶ÓÁÐÖÐÓдýÖ´ÐеÄÈÎÎñʱ»á´Ó¶ÓÁÐÖе¯³öÒ»¸öÈÎÎñ²¢·µ»Ø,Èç¹û×èÈû¶ÓÁÐΪ¿Õ,ÄÇô¾Í»á×èÈûµÈ´ýеÄÈÎÎñÌá½»µ½¶ÓÁÐÖÐÖ±µ½³¬Ê±(ÔÚһЩÅäÖÃÏ»áÒ»Ö±µÈ´ý¶ø²»³¬Ê±),Èç¹ûÔÚ³¬Ê±Ö®Ç°»ñÈ¡µ½ÁËеÄÈÎÎñ,ÄÇô¾Í»á½«Õâ¸öÈÎÎñ×÷Ϊ·µ»ØÖµ·µ»Ø¡£ËùÒÔÒ»°ã getTask ·½·¨ÊDz»»á·µ»Ø null µÄ,Ö»»á×èÈûµÈ´ýÏÂÒ»¸öÈÎÎñ²¢ÔÚÖ®ºó½«Õâ¸öÐÂÈÎÎñ×÷Ϊ·µ»ØÖµ·µ»Ø¡£

µ± getTask ·½·¨·µ»Ø null ʱ»áµ¼Öµ±Ç° Worker Í˳ö,µ±Ç°Ï̱߳»Ïú»Ù¡£ÔÚÒÔÏÂÇé¿öÏ getTask ·½·¨²Å»á·µ»Ø null:

  • µ±Ç°Ï̳߳ØÖеÄÏß³ÌÊý³¬¹ýÁË×î´óÏß³ÌÊý¡£ÕâÊÇÒòΪÔËÐÐʱͨ¹ýµ÷Óà setMaximumPoolSize ÐÞ¸ÄÁË×î´óÏß³ÌÊý¶øµ¼ÖµĽá¹û;
  • Ï̳߳ش¦ÓÚ STOP ״̬¡£ÕâÖÖÇé¿öÏÂËùÓÐÏ̶߳¼Ó¦¸Ã±»Á¢¼´»ØÊÕÏú»Ù;
  • Ï̳߳ش¦ÓÚ SHUTDOWN ״̬,ÇÒ×èÈû¶ÓÁÐΪ¿Õ¡£ÕâÖÖÇé¿öÏÂÒѾ­²»»áÓÐеÄÈÎÎñ±»Ìá½»µ½×èÈû¶ÓÁÐÖÐÁË,ËùÒÔÏß³ÌÓ¦¸Ã±»Ïú»Ù;
  • Ï߳̿ÉÒÔ±»³¬Ê±»ØÊÕµÄÇé¿öϵȴýÐÂÈÎÎñ³¬Ê±¡£Ï̱߳»³¬Ê±»ØÊÕÒ»°ãÓÐÒÔÏÂÁ½ÖÖÇé¿ö:
    • ÔÊÐíºËÐÄÏ̳߳¬Ê±(Ï̳߳ØÅäÖÃ)µÄÇé¿öÏÂÏ̵߳ȴýÈÎÎñ³¬Ê±
    • ³¬³öºËÐÄÏß³ÌÊý²¿·ÖµÄÏ̵߳ȴýÈÎÎñ³¬Ê±

3.3.4 ÈÎÎñ¾Ü¾ø

ÈÎÎñ¾Ü¾øÄ£¿éÊÇÏ̳߳صı£»¤²¿·Ö,Ï̳߳ØÓÐÒ»¸ö×î´óµÄÈÝÁ¿,µ±Ï̳߳صÄÈÎÎñ»º´æ¶ÓÁÐÒÑÂú,²¢ÇÒÏ̳߳ØÖеÄÏß³ÌÊýÄ¿´ïµ½ maximumPoolSize ʱ,¾ÍÐèÒª¾Ü¾øµô¸ÃÈÎÎñ,²ÉÈ¡ÈÎÎñ¾Ü¾ø²ßÂÔ,±£»¤Ï̳߳ء£

¾Ü¾ø²ßÂÔÊÇÒ»¸ö½Ó¿Ú,ÆäÉè¼ÆÈçÏÂ:

ÔÚÕâÀï²åÈëͼƬÃèÊö
Óû§¿ÉÒÔͨ¹ýʵÏÖÕâ¸ö½Ó¿ÚÈ¥¶¨Öƾܾø²ßÂÔ,Ò²¿ÉÒÔÑ¡Ôñ JDK ÌṩµÄËÄÖÖÒÑÓоܾø²ßÂÔ,ÆäÌصãÈçÏÂ:
ÔÚÕâÀï²åÈëͼƬÃèÊö

3.4 Ï̳߳ØÈçºÎ¹ÜÀíÏß³Ì

3.4.1 WorkerÏß³Ì

Ï̳߳ØΪÁËÕÆÎÕÏ̵߳Ä״̬²¢Î¬»¤Ï̵߳ÄÉúÃüÖÜÆÚ,Éè¼ÆÁËÏ̳߳ØÄڵŤ×÷Ïß³Ì Worker¡£ÎÒÃÇÀ´¿´Ò»ÏÂËüµÄ´úÂë:

ÔÚÕâÀï²åÈëͼƬÃèÊö
Worker Õâ¸ö¹¤×÷Ïß³Ì,ʵÏÖÁË Runnable ½Ó¿Ú,²¢³ÖÓÐÒ»¸öÏß³Ìthread,Ò»¸ö³õʼ»¯µÄÈÎÎñfirstTask¡£thread ÊÇÔÚµ÷Óù¹Ôì·½·¨Ê±Í¨¹ý ThreadFactory À´´´½¨µÄÏß³Ì,¿ÉÒÔÓÃÀ´Ö´ÐÐÈÎÎñ;

firstTask ÓÃËüÀ´±£´æ´«ÈëµÄµÚÒ»¸öÈÎÎñ,Õâ¸öÈÎÎñ¿ÉÒÔÓÐÒ²¿ÉÒÔΪ null¡£Èç¹ûÕâ¸öÖµÊÇ·Ç¿ÕµÄ,ÄÇôÏ߳̾ͻáÔÚÆô¶¯³õÆÚÁ¢¼´Ö´ÐÐÕâ¸öÈÎÎñ,Ò²¾Í¶ÔÓ¦ºËÐÄÏ̴߳´½¨Ê±µÄÇé¿ö;Èç¹ûÕâ¸öÖµÊÇ¿ÕµÄ,ÄÇô¾ÍÐèÒª´´½¨Ò»¸öÏß³ÌÈ¥Ö´ÐÐÈÎÎñÁбí(workQueue)ÖеÄÈÎÎñ,Ò²¾ÍÊǷǺËÐÄÏ̵߳Ĵ´½¨¡£

3.4.1.1 AQS ×÷ÓÃ

Worker ¼Ì³ÐÁË AbstractQueuedSynchronizer,Ö÷ҪĿµÄÓÐÁ½¸ö:

  • ½«ËøµÄÁ£¶Èϸ»¯µ½Ã¿¸ö Worker
    Èç¹û¶à¸ö Worker ʹÓÃͬһ¸öËø,ÄÇôһ¸ö Worker Running ³ÖÓÐËøµÄʱºò,ÆäËû Worker ¾ÍÎÞ·¨Ö´ÐÐ,ÕâÏÔÈ»ÊDz»ºÏÀíµÄ¡£

  • Ö±½ÓʹÓà CAS »ñÈ¡,±ÜÃâ×èÈû¡£
    Èç¹ûÕâ¸öËøʹÓÃ×èÈû»ñÈ¡,ÄÇôÔÚ¶à Worker µÄÇé¿öÏÂÖ´ÐÐ shutDown¡£Èç¹ûÕâ¸ö Worker ´ËʱÕýÔÚ Running ÎÞ·¨»ñÈ¡µ½Ëø,ÄÇôִÐÐ shutDown() Ï߳̾ͻá×èÈûסÁË,ÏÔÈ»ÊDz»ºÏÀíµÄ¡£

3.4.1.2 Runnable ×÷ÓÃ

Worker »¹ÊµÏÖÁË Runnable,ËüÓÐÁ½¸öÊôÐÔ thead¡¢firstTask¡£

firstTask ÓÃËüÀ´±£´æ´«ÈëµÄµÚÒ»¸öÈÎÎñ,Õâ¸öÈÎÎñ¿ÉÒÔÓÐÒ²¿ÉÒÔΪ null¡£

  • Èç¹ûÕâ¸öÖµÊÇ·Ç¿ÕµÄ,ÄÇôÏ߳̾ͻáÔÚÆô¶¯³õÆÚÁ¢¼´Ö´ÐÐÕâ¸öÈÎÎñ,Ò²¾Í¶ÔÓ¦ºËÐÄÏ̴߳´½¨Ê±µÄÇé¿ö¡£
  • Èç¹ûÕâ¸öÖµÊÇ null,ÄÇô¾ÍÐèÒª´´½¨Ò»¸öÏß³ÌÈ¥Ö´ÐÐÈÎÎñÁбí(workQueue)ÖеÄÈÎÎñ,Ò²¾ÍÊǷǺËÐÄÏ̵߳Ĵ´½¨¡£

¸ù¾ÝÕûÌåÁ÷³Ì:

Ï̳߳ص÷Óà execute ¡ª> ´´½¨ Worker(ÉèÖÃÊôÐÔthead¡¢firstTask)¡ª> worker.thread.start() ¡ª> ʵ¼ÊÉϵ÷ÓõÄÊÇ worker.run() ¡ª> Ïß³Ì³ØµÄ runWorker(worker) ¡ª> worker.firstTask.run() (Èç¹û firstTask Ϊ null ¾Í´ÓµÈ´ý¶ÓÁÐÖÐÀ­È¡Ò»¸ö)¡£

Worker Ö´ÐÐÈÎÎñµÄÄ£ÐÍÈçÏÂͼËùʾ:
ÔÚÕâÀï²åÈëͼƬÃèÊö
3.4.2 Worker Ïß³ÌÔö¼Ó

Ôö¼ÓÏß³ÌÊÇͨ¹ýÏ̳߳ØÖÐµÄ addWorker ·½·¨,¸Ã·½·¨µÄ¹¦ÄܾÍÊÇÔö¼ÓÒ»¸öÏß³Ì,¸Ã·½·¨²»¿¼ÂÇÏ̳߳ØÊÇÔÚÄĸö½×¶ÎÔö¼ÓµÄ¸ÃÏß³Ì,Õâ¸ö·ÖÅäÏ̵߳IJßÂÔÊÇÔÚÉϸö²½ÖèÍê³ÉµÄ,¸Ã²½Öè½ö½öÍê³ÉÔö¼ÓÏß³Ì,²¢Ê¹ËüÔËÐÐ,×îºó·µ»ØÊÇ·ñ³É¹¦Õâ¸ö½á¹û¡£

addWorker ·½·¨ÓÐÁ½¸ö²ÎÊý:firstTask¡¢core¡£

  • firstTask ²ÎÊýÓÃÓÚÖ¸¶¨ÐÂÔöµÄÏß³ÌÖ´ÐеĵÚÒ»¸öÈÎÎñ,¸Ã²ÎÊý¿ÉÒÔΪ¿Õ;
  • core ²ÎÊýΪ true ±íʾÔÚÐÂÔöÏß³Ìʱ»áÅжϵ±Ç°»î¶¯Ïß³ÌÊýÊÇ·ñÉÙÓÚ corePoolSize,false ±íʾÐÂÔöÏß³ÌÇ°ÐèÒªÅжϵ±Ç°»î¶¯Ïß³ÌÊýÊÇ·ñÉÙÓÚ maximumPoolSize¡£

ÎÒÃÇÀ´¿´Ò»Ï addWorker µÄÔ´Âë:

ÔÚÕâÀï²åÈëͼƬÃèÊö
Ô´Âë¿´×ÅÊDz»ÊÇͦ·Ñ¾¢µÄ?û¹Øϵ,ÔÙ¿´Ò»ÕÅÖ´ÐÐÁ÷³Ìͼ¼ÓÉîÏÂÓ³Ïó¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö

3.4.3 Worker Ïß³ÌÖ´ÐÐÈÎÎñ

Worker ÖеÄÏß³Ì start µÄʱºò,µ÷Óà Worker ±¾Éí run ·½·¨,Õâ¸ö run ·½·¨µ÷ÓÃÍⲿÀàThreadPoolExecutor µÄ runWorker ·½·¨,Ö±½Ó¿´ runWorker ·½·¨µÄÔ´Âë:

ÔÚÕâÀï²åÈëͼƬÃèÊö
Ö´ÐÐÁ÷³ÌÈçÏÂ:

  • while Ñ­»·²»¶ÏµØͨ¹ý getTask() ·½·¨»ñÈ¡ÈÎÎñ
  • getTask() ·½·¨´Ó×èÈû¶ÓÁÐÖÐÈ¡ÈÎÎñ
  • Èç¹ûÏ̳߳ØÕýÔÚÍ£Ö¹,ÄÇôҪ±£Ö¤µ±Ç°Ïß³ÌÊÇÖжÏ״̬,·ñÔòÒª±£Ö¤µ±Ç°Ï̲߳»ÊÇÖжÏ״̬¡£
  • Ö´ÐÐÈÎÎñ
  • Èç¹û getTask ½á¹ûΪ null ÔòÌø³öÑ­»·,Ö´ÐÐ processWorkerExit() ·½·¨,Ïú»ÙÏ̡߳£

ÔÚÕâÀï²åÈëͼƬÃèÊö
3.4.4 Worker Ï̻߳ØÊÕ

Ï̳߳ØÖÐÏ̵߳ÄÏú»ÙÒÀÀµ JVM ×Ô¶¯µÄ»ØÊÕ,Ï̳߳Ø×öµÄ¹¤×÷ÊǸù¾Ýµ±Ç°Ï̳߳صÄ״̬ά»¤Ò»¶¨ÊýÁ¿µÄÏß³ÌÒýÓÃ,·ÀÖ¹Õⲿ·ÖÏ̱߳» JVM »ØÊÕ,µ±Ï̳߳ؾö¶¨ÄÄЩÏß³ÌÐèÒª»ØÊÕʱ,Ö»ÐèÒª½«ÆäÒýÓÃÏû³ý¼´¿É¡£Worker ±»´´½¨³öÀ´ºó,¾Í»á²»¶ÏµØ½øÐÐÂÖѯ,È»ºó»ñÈ¡ÈÎÎñÈ¥Ö´ÐÐ,ºËÐÄÏ߳̿ÉÒÔÎÞÏ޵ȴý»ñÈ¡ÈÎÎñ,·ÇºËÐÄÏß³ÌÒªÏÞʱ»ñÈ¡ÈÎÎñ¡£µ± Worker ÎÞ·¨»ñÈ¡µ½ÈÎÎñ,Ò²¾ÍÊÇ»ñÈ¡µÄÈÎÎñΪ¿Õʱ,Ñ­»·»á½áÊø,Worker »áÖ÷¶¯Ïû³ý×ÔÉíÔÚÏ̳߳ØÄÚµÄÒýÓá£

Ï̻߳ØÊյŤ×÷ÊÇÔÚ processWorkerExit ·½·¨Íê³ÉµÄ¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö
ÔÚ»ØÊÕ Worker µÄʱºòÏ̳߳ػ᳢ÊÔ½áÊø×Ô¼ºµÄÔËÐÐ,tryTerminate ·½·¨:

ÔÚÕâÀï²åÈëͼƬÃèÊö
3.4.4 Worker Ï̹߳رÕ

˵µ½Ï̹߳رÕ,ÎÒÃǾͲ»µÃ²»À´ËµËµ shutdown ·½·¨ºÍ shutdownNow ·½·¨¡£

3.4.4.1 shutdown

ÔÚÕâÀï²åÈëͼƬÃèÊö
interruptIdleWorkers ·½·¨,×¢Òâ,Õâ¸ö·½·¨´ò¶ÏµÄÊÇÏÐÖà Worker,´ò¶ÏÏÐÖà Worker Ö®ºó,getTask ·½·¨»á·µ»Ø null,È»ºó Worker »á±»»ØÊÕ¡£ÄÇʲôÊÇÏÐÖà Worker ÄØ?

ÏÐÖà Worker ÊÇÕâÑù½âÊ͵Ä:Worker ÔËÐеÄʱºò»áÈ¥×èÈû¶ÓÁÐÄÃÊý¾Ý(getTask·½·¨),ÄõÄʱºòÈç¹ûûÓÐÉèÖó¬Ê±Ê±¼ä,ÄÇô»áÒ»Ö±×èÈûµÈ´ý×èÈû¶ÓÁнøÊý¾Ý,ÕâÑùµÄ Worker ¾Í±»³ÆΪÏÐÖà Worker¡£ÓÉÓÚ Worker Ò²ÊÇÒ»¸ö AQS,ÔÚ runWorker ·½·¨Àï»áÓÐÒ»¶Ô lock ºÍ unlock ²Ù×÷,Õâ¶Ô lock ²Ù×÷ÊÇΪÁËÈ·±£ Worker ²»ÊÇÒ»¸öÏÐÖà Worker¡£

ËùÒÔ Worker ±»Éè¼Æ³ÉÒ»¸ö AQS ÊÇΪÁ˸ù¾Ý Worker µÄËøÀ´ÅжÏÊÇ·ñÊÇÏÐÖÃÏß³Ì,ÊÇ·ñ¿ÉÒÔ±»Ç¿ÖÆÖжϡ£

ÏÂÃæÎÒÃÇ¿´Ï interruptIdleWorkers ·½·¨:

ÔÚÕâÀï²åÈëͼƬÃèÊö
3.4.4.2 shutdownNow

shutdown ·½·¨½«Ï̳߳Ø״̬¸Ä³É SHUTDOWN,Ï̳߳ػ¹ÄܼÌÐø´¦Àí×èÈû¶ÓÁÐÀïµÄÈÎÎñ,²¢ÇÒ»á»ØÊÕһЩÏÐÖÃµÄ Worker¡£µ«ÊÇ shutdownNow ·½·¨²»Ò»Ñù,Ëü»á°ÑÏ̳߳Ø״̬¸Ä³É STOP ״̬,ÕâÑù²»»á´¦Àí×èÈû¶ÓÁÐÀïµÄÈÎÎñ,Ò²²»»á´¦ÀíеÄÈÎÎñ¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö
shutdownNow µÄÖÐ¶ÏºÍ shutdown ·½·¨²»Ò»Ñù,µ÷ÓõÄÊÇ interruptWorkers ·½·¨:
ÔÚÕâÀï²åÈëͼƬÃèÊö
3.4.4.3 Worker Ï̹߳رÕС½á

shutdown ·½·¨»á¸üÐÂ״̬µ½ SHUTDOWN,²»»áÓ°Ïì×èÈû¶ÓÁÐÀïÈÎÎñµÄÖ´ÐÐ,µ«ÊDz»»áÖ´ÐÐнøÀ´µÄÈÎÎñ¡£Í¬Ê±Ò²»á»ØÊÕÏÐÖÃµÄ Worker,ÏÐÖà Worker µÄ¶¨ÒåÉÏÃæÒѾ­Ëµ¹ýÁË¡£

shutdownNow ·½·¨»á¸üÐÂ״̬µ½ STOP,»áÓ°Ïì×èÈû¶ÓÁеÄÈÎÎñÖ´ÐÐ,Ò²²»»áÖ´ÐÐнøÀ´µÄÈÎÎñ¡£Í¬Ê±»á»ØÊÕËùÓÐµÄ Worker¡£

?ÕâÀïÀÏÖܾͲ»Ð´×ܽáÁË,ÿ¿é¶¼·ÖÎöµÄºÜÇå³þÁË¡£ÏàÐÅ´ó¼Ò¿´ÍêÕâƪÎÄÕÂ?,ÐÄÀïÒ²ÓÐÁË×Ô¼ºÏëÒªµÄ´ð°¸¡£


»¶Ó­´ó¼Ò¹Ø×¢ÎҵĹ«Öںš¾ÀÏÖÜÁļܹ¹¡¿,Javaºó¶ËÖ÷Á÷¼¼ÊõÕ»µÄÔ­Àí¡¢Ô´Âë·ÖÎö¡¢¼Ü¹¹ÒÔ¼°¸÷ÖÖ»¥ÁªÍø¸ß²¢·¢¡¢¸ßÐÔÄÜ¡¢¸ß¿ÉÓõĽâ¾ö·½°¸¡£

ÔÚÕâÀï²åÈëͼƬÃèÊö
ϲ»¶µÄ»°,Ò»¼üÈýÁ¬×ßÒ»²¨¡£

£»Ô­ÎÄÁ´½Ó£ºhttps://blog.csdn.net/riemann_/article/details/115824556
±¾Õ¾²¿·ÖÄÚÈÝתÔØÓÚÍøÂ磬°æȨ¹éÔ­×÷ÕßËùÓУ¬×ªÔØ֮ĿµÄÔÚÓÚ´«²¥¸ü¶àÓÅÐã¼¼ÊõÄÚÈÝ£¬ÈçÓÐÇÖȨÇëÁªÏµQQ/΢ÐÅ£º153890879ɾ³ý£¬Ð»Ð»£¡
ÉÏһƪ£ºJSÀàºÍ¶ÔÏó ÏÂһƪ£ºÃ»ÓÐÁË

ÍƼöͼÎÄ

  • ÖÜÅÅÐÐ
  • ÔÂÅÅÐÐ
  • ×ÜÅÅÐÐ

Ëæ»úÍƼö