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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
javaÏ̳߳صÄÔ­Àíѧϰ
 
×÷ÕߣºÐÄÇçgood À´Ô´£ºsegmentfault.com ·¢²¼ÓÚ 2015-9-8
  1930  次浏览      27
 

Executor½Ó¿Ú

Èç¹û²é¿´jdkÎĵµ£¬»á·¢ÏÖjavaÏ̳߳ض¼Ô´×ÔÓÚÕâ¸ö³¬¼¶½Ó¿ÚExecutor£¬µ«ÊÇÕâ¸ö½Ó¿Ú±¾Éí±È½Ï¼òµ¥£º

public interface Executor {

/**
ÔÚδÀ´Ä³¸öʱ¼äÖ´Ðиø¶¨µÄÃüÁî¡£¸ÃÃüÁî¿ÉÄÜÔÚеÄÏ̡߳¢ÒÑÈë³ØµÄÏ̻߳òÕßÕýµ÷ÓõÄÏß³ÌÖÐÖ´ÐУ¬
ÕâÓÉ Executor ʵÏÖ¾ö¶¨¡£
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution.
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}

¿ÉÒÔ¿´µ½Executor ÖÐÖ»ÓÐÒ»¸öexecute ·½·¨¡£´Ë½Ó¿ÚÌṩһÖÖ½«ÈÎÎñÌá½»Óëÿ¸öÈÎÎñ½«ÈçºÎÔËÐеĻúÖÆ·ÖÀ뿪À´µÄ·½·¨£¬Ïà±È½ÏΪÿ¸öÈËÎïµ÷ÓÃnew Thread(Runnable r).start() ,ÎÒÃǸüÆ«ÏòÓÚʹÓÃExecutor £¨Ö´ÐÐÆ÷£©À´ÔËÐÐÈÎÎñ£º

Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
...

ʵÏÖÒ»¸öÖ´ÐÐÆ÷Ò²ºÜ¼òµ¥£º

class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}

ExecutorService½Ó¿Ú

Executor ÌṩµÄ·½·¨Ì«ÉÙÁË£¡¸ù±¾²»ÄÜÂú×ãÈÕ³£ËùÐ裬¶ø´ÓËüÅÉÉúÏÂÀ´µÄ½Ó¿ÚExecutorService ÔòÏԵøüͨÓ㬱Ͼ¹ËüÒ²ÊǸöService¡£

public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
...
}

¿ÉÒÔ¿´µ½,ExecutorService ½Ó¿ÚÖаüº¬ÁËÎÒÃÇÆ½³£Ê¹ÓõÄÏ̳߳صľø´ó¶àÊý·½·¨£¬ÆäÖеÄһЩ·½·¨ÔÚÉÏÎÄÒѾ­½éÉܹýÁË¡£

AbstractExecutorService

AbstractExecutorServiceÊÇÒ»¸ö³éÏóÀ࣬²¢ÇÒʵÏÖÁËExecutorService½Ó¿Ú¡£

public abstract class AbstractExecutorService implements ExecutorService

ÔÚÕâ¸öÀàÖУ¬ÌṩÁËExecutorService һЩ·½·¨µÄĬÈÏʵÏÖ£¬±ÈÈçsubmit £¬invokeAll £¬Ê×ÏÈ¿´submit µÄʵÏÖ£º

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

ÆäÖÐʹÓÃÁËnewTaskFor ·½·¨£º

protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable);
}

newTaskFor ·½·¨Ö»ÊǼòµ¥µÄ½«¸ø¶¨¿Éµ÷ÓÃÈÎÎñ°ü×°³ÉÒ»¸öRunnableFuture £¬Ê¹Æä¾ßÓÐÈ¡ÏûÔËÐеÄÌØÐÔ¡£¶øsubmit ÖÐÖ±½Ó½«ÈÎÎñ½»¸øexecute() ÔËÐÐ.

ÔÙÀ´¿´invokeAll() :

public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
if (tasks == null)
throw new NullPointerException();
//´´½¨Ò»¸ölist±£´æËùÓеĽá¹û
List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
boolean done = false;
try {
for (Callable<T> t : tasks) {
RunnableFuture<T> f = newTaskFor(t);
futures.add(f);
execute(f); //ÔËÐÐÈÎÎñ
}
for (Future<T> f : futures) {
if (!f.isDone()) { //ÒÀ´ÎÈ¡½á¹û
try {
f.get(); //ÕâÀïʹÓÃgetÊÇΪÁ˵ȴýÔËÐÐÍê³É£¬Èç¹ûûÍê³É¾Í»á×èÈû
} catch (CancellationException ignore) {
} catch (ExecutionException ignore) {
}
}
}
done = true;
return futures;
} finally {
if (!done) //Èç¹û·¢ÉúÒì³££¬ÔòÈ¡ÏûËùÓÐÈÎÎñ
for (Future<T> f : futures)
f.cancel(true);
}
}

ThreadPoolExecutor¼òµ¥½éÉÜ

ThreadPoolExecutor£¬Ï̳߳ØÀ࣬¼Ì³Ð×Ô AbstractExecutorService

public class ThreadPoolExecutor extends AbstractExecutorService

¹¹Ôì·½·¨

ThreadPoolExecutor ÌṩÁËËÄÖÖ¹¹Ôì·½·¨ÊµÏÖ(ÕâÀïÖ»½éÉÜÒ»ÖÖ)£º

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}

ÓбØÒª¶Ôÿ¸ö²ÎÊý½âÊÍһϣº

corePoolSize - ³ØÖÐËù±£´æµÄÏß³ÌÊý£¬°üÀ¨¿ÕÏÐÏ̡߳£

maximumPoolSize - ³ØÖÐÔÊÐíµÄ×î´óÏß³ÌÊý¡£

keepAliveTime - µ±Ïß³ÌÊý´óÓÚºËÐÄʱ£¬´ËΪÖÕֹǰ¶àÓàµÄ¿ÕÏÐÏ̵߳ȴýÐÂÈÎÎñµÄ×ʱ¼ä¡£

unit - keepAliveTime ²ÎÊýµÄʱ¼äµ¥Î»¡£

workQueue - Ö´ÐÐǰÓÃÓÚ±£³ÖÈÎÎñµÄ¶ÓÁС£´Ë¶ÓÁнö±£³ÖÓÉ execute ·½·¨Ìá½»µÄ Runnable ÈÎÎñ¡£

threadFactory - Ö´ÐгÌÐò´´½¨ÐÂÏß³ÌʱʹÓõŤ³§¡£

handler - ÓÉÓÚ³¬³öÏ̷߳¶Î§ºÍ¶ÓÁÐÈÝÁ¿¶øÊ¹Ö´Ðб»×èÈûʱËùʹÓõĴ¦Àí³ÌÐò¡£

ÅäÖùæÔò

ΪÁ˱ãÓÚ¿ç´óÁ¿ÉÏÏÂÎÄʹÓ㬴ËÀàÌṩÁ˺ܶà¿Éµ÷ÕûµÄ²ÎÊýºÍÀ©Õ¹¹³×Ó (hook)¡£jdkÎĵµÖн¨ÒéÔÚͨ³£Çé¿öÏ£¬Ê¹Óà Executors ÌṩµÄ¹¤³§·½·¨ÅäÖã¬Ò²¾ÍÊÇÌṩºÃÁ˵ÄÏ̳߳ء£Èô·ÇÒªÊÖ¶¯ÅäÖã¬ÐèÒª×ñÑ­ÒÔϹæÔò£º

ºËÐĺÍ×î´ó³Ø´óС

ThreadPoolExecutor ½«¸ù¾Ý corePoolSize ºÍ maximumPoolSize ÉèÖõı߽ç×Ô¶¯µ÷Õû³Ø´óС¡£µ±ÐÂÈÎÎñÔÚ·½·¨execute(java.lang.Runnable) ÖÐÌύʱ:

1.ÔËÐеÄÏß³ÌÉÙÓÚ corePoolSize£¬Ôò´´½¨ÐÂÏß³ÌÀ´´¦ÀíÇëÇ󣬼´Ê¹ÆäËû¸¨ÖúÏß³ÌÊÇ¿ÕÏеġ£

2:ÔËÐеÄÏ̶߳àÓÚ corePoolSize ¶øÉÙÓÚ maximumPoolSize£¬Ôò°ÑÈÎÎñ·Å½ø¶ÓÁУ¬ÓÉ¿ÕÏÐÏ̴߳ӶÓÁÐÖÐÈ¡ÈÎÎñ£¬½öµ±¶ÓÁÐÂúʱ²Å´´½¨ÐÂÏ̡߳£

3:Èç¹ûÉèÖÃµÄ corePoolSize ºÍ maximumPoolSize Ïàͬ£¬Ôò´´½¨Á˹̶¨´óСµÄÏ̳߳ء£

4:Èç¹û½« maximumPoolSize ÉèÖÃΪ»ù±¾µÄÎÞ½çÖµ£¨Èç Integer.MAX_VALUE £©£¬ÔòÔÊÐí³ØÊÊÓ¦ÈÎÒâÊýÁ¿µÄ²¢·¢ÈÎÎñ¡£

»¹Òª×¢ÒâÒÔÏÂÁ½µã£º

ÔÚ´ó¶àÊýÇé¿öÏ£¬ºËÐĺÍ×î´ó³Ø´óС½ö»ùÓÚ¹¹ÔìÆ÷À´ÉèÖ㬲»¹ýÒ²¿ÉÒÔʹÓà setCorePoolSize(int) ºÍ setMaximumPoolSize(int) ½øÐж¯Ì¬¸ü¸Ä¡£

µ±³ØÖеÄÏß³ÌÊý´óÓÚ corePoolSize µÄʱºò£¬¶àÓàµÄÏ̻߳áµÈ´ý keepAliveTime ³¤µÄʱ¼ä£¬Èç¹ûÎÞÇëÇó¿É´¦Àí¾Í×ÔÐÐÏú»Ù¡£

´´½¨ÐÂÏß³Ì

ʹÓà ThreadFactory ´´½¨ÐÂÏ̡߳£Èç¹ûûÓÐÁíÍâ˵Ã÷£¬ÔòÔÚͬһ¸ö ThreadGroup ÖÐÒ»ÂÉʹÓà Executors.defaultThreadFactory() ´´½¨Ị̈߳¬²¢ÇÒÕâЩÏ߳̾ßÓÐÏàͬµÄ NORM_PRIORITY ÓÅÏȼ¶ºÍ·ÇÊØ»¤½ø³Ì״̬¡£Í¨¹ýÌṩ²»Í¬µÄ ThreadFactory£¬¿ÉÒԸıäÏ̵߳ÄÃû³Æ¡¢Ïß³Ì×é¡¢ÓÅÏȼ¶¡¢ÊØ»¤½ø³Ì״̬£¬µÈµÈ¡£Èç¹û´Ó newThread ·µ»Ø null ʱ ThreadFactory δÄÜ´´½¨Ị̈߳¬ÔòÖ´ÐгÌÐò½«¼ÌÐøÔËÐУ¬µ«²»ÄÜÖ´ÐÐÈκÎÈÎÎñ¡£

ThreadFactory ÊÇÏ̹߳¤³§£¬ËüÊÇÒ»¸ö½Ó¿Ú£º

public interface ThreadFactory {
Thread newThread(Runnable r);
}

ThreadPoolExecutor ÖÐµÄ threadFactory ÊÇÓÉ Executors ¹¤¾ßÀàÌṩµÄ£º

public static ThreadFactory defaultThreadFactory() {
return new DefaultThreadFactory();
}

static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;

DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
}

public Thread newThread(Runnable r) {
////´´½¨µÄÏß³ÌÒÔ¡°pool-N-thread-M¡±ÃüÃû£¬NÊǸù¤³§µÄÐòºÅ£¬MÊÇÏ̺߳Å
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
//ÉèΪ·Çºǫ́Ïß³Ì
if (t.isDaemon())
t.setDaemon(false);
//ÓÅÏȼ¶Îªnormal
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}

DefaultThreadFactory ÊÇÒ»¸ö¾²Ì¬ÄÚ²¿Àà

ÅŶӲßÂÔ

Ç°ÃæËµµ½£¬µ±Ï̳߳ØÖÐÔËÐеÄÏ̵߳ÈÓÚ»ò¶àÓÚ corePoolSize£¬Ôò Executor ʼÖÕÊ×Ñ¡½«ÇëÇó¼ÓÈë¶ÓÁУ¬¶ø²»Ìí¼ÓеÄỊ̈߳¬½«ÈÎÎñ¼ÓÈë¶ÓÁÐÓÐÈýÖÖ²ßÂÔ£¨¾ßÌå²Î¼ûjdkÎĵµ£©¡£

±»¾Ü¾øµÄÈÎÎñ

Á½ÖÖÇé¿öÏ£¬ÐÂÌá½»µÄÈÎÎñ½«»á±»¾Ü¾ø£º

µ± Executor ÒѾ­¹Ø±Õ

Executor ½«ÓÐÏޱ߽çÓÃÓÚ×î´óÏ̺߳͹¤×÷¶ÓÁÐÈÝÁ¿£¬ÇÒÒѾ­±¥ºÍ

±»¾Ü¾øµÄÈÎÎñ£¬ execute ·½·¨¶¼½«µ÷ÓÃÆä RejectedExecutionHandler µÄRejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) ·½·¨¡£ÏÂÃæÌṩÁËËÄÖÖÔ¤¶¨ÒåµÄ´¦Àí³ÌÐò²ßÂÔ£º

ÔÚĬÈ쵀 ThreadPoolExecutor.AbortPolicy ÖУ¬´¦Àí³ÌÐòÔâµ½¾Ü¾ø½«Å׳öÔËÐÐʱ RejectedExecutionException¡£

ÔÚ ThreadPoolExecutor.CallerRunsPolicy ÖУ¬Ï̵߳÷ÓÃÔËÐиÃÈÎÎñµÄ execute ±¾Éí¡£´Ë²ßÂÔÌṩ¼òµ¥µÄ·´À¡¿ØÖÆ»úÖÆ£¬Äܹ»¼õ»ºÐÂÈÎÎñµÄÌá½»ËÙ¶È¡£

ÔÚ ThreadPoolExecutor.DiscardPolicy ÖУ¬²»ÄÜÖ´ÐеÄÈÎÎñ½«±»É¾³ý¡£

ÔÚ ThreadPoolExecutor.DiscardOldestPolicy ÖУ¬Èç¹ûÖ´ÐгÌÐòÉÐδ¹Ø±Õ£¬ÔòλÓÚ¹¤×÷¶ÓÁÐÍ·²¿µÄÈÎÎñ½«±»É¾³ý£¬È»ºóÖØÊÔÖ´ÐгÌÐò£¨Èç¹ûÔÙ´Îʧ°Ü£¬ÔòÖØ¸´´Ë¹ý³Ì£©¡£

¶¨ÒåºÍʹÓÃÆäËûÖÖÀàµÄ RejectedExecutionHandler ÀàÒ²ÊÇ¿ÉÄܵ쬵«ÕâÑù×öÐèÒª·Ç³£Ð¡ÐÄ£¬ÓÈÆäÊǵ±²ßÂÔ½öÓÃÓÚÌØ¶¨ÈÝÁ¿»òÅŶӲßÂÔʱ¡£

¹³×Ó·½·¨

´ËÀàÌṩÁ½¸ö protected ¿ÉÖØÐ´µÄ ¹³×Ó·½·¨£º

protected void beforeExecute(Thread t, Runnable r) { }
protected void afterExecute(Runnable r, Throwable t) { }

ÕâÁ½ÖÖ·½·¨·Ö±ðÔÚÖ´ÐРÿ¸öÈÎÎñ ֮ǰºÍÖ®ºóµ÷Óá£ËüÃÇ¿ÉÓÃÓÚ²Ù×ÝÖ´Ðл·¾³£»×¢ÒâÕâÀïÊÇÿ¸öÈÎÎñ£¬¼´Ã¿´ÎÔËÐÐÐÂÈÎÎñʱ¶¼»áÖ´ÐÐÒ»±é¡£ÀýÈç£¬ÖØÐ³õʼ»¯ ThreadLocal ¡¢ËѼ¯Í³¼ÆÐÅÏ¢»òÌí¼ÓÈÕÖ¾ÌõÄ¿¡£´ËÍ⣬»¹¿ÉÒÔÖØÐ´·½·¨ terminated() À´Ö´ÐÐ Executor ÍêÈ«ÖÕÖ¹ºóÐèÒªÍê³ÉµÄËùÓÐÌØÊâ´¦Àí¡£

Èç¹û¹³×Ó (hook) »ò»Øµ÷·½·¨Å׳öÒì³££¬ÔòÄÚ²¿¸¨ÖúÏ߳̽«ÒÀ´Îʧ°Ü²¢Í»È»ÖÕÖ¹¡£

jdkÎĵµÖÐÌṩÁËÒ»¸ö¿ÉÒÔÔÝÍ£ºÍ»Ö¸´µÄÏ̳߳ØÀý×Ó£º

class PausableThreadPoolExecutor extends ThreadPoolExecutor {
private boolean isPaused;
private ReentrantLock pauseLock = new ReentrantLock();
private Condition unpaused = pauseLock.newCondition();

public PausableThreadPoolExecutor(...) { super(...); }
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
pauseLock.lock();
try {
while (isPaused) unpaused.await();
} catch(InterruptedException ie) {
t.interrupt();
} finally {
pauseLock.unlock();
}
}
public void pause() {
pauseLock.lock();
try {
isPaused = true;
} finally {
pauseLock.unlock();
}
}
public void resume() {
pauseLock.lock();
try {
isPaused = false;
unpaused.signalAll();
} finally {
pauseLock.unlock();
}
}
}

ThreadPoolExecutorÔËÐÐÔ­Àí

ThreadPoolExecutorÉîÈëÆÊÎö

Ï̳߳صÄÎåÖÖ״̬

ThreadPoolExecutor ÀàÖн«Ïß³Ì״̬£¨ runState£©·ÖΪÁËÒÔÏÂÎåÖÖ£º

RUNNING£º¿ÉÒÔ½ÓÊÜÐÂÈÎÎñ²¢ÇÒ´¦Àí½øÈë¶ÓÁÐÖеÄÈÎÎñ

SHUTDOWN£º²»½ÓÊÜÐÂÈÎÎñ£¬µ«ÊÇÈÔȻִÐжÓÁÐÖеÄÈÎÎñ

STOP£º²»½ÓÊÜÐÂÈÎÎñÒ²²»Ö´ÐжÓÁÐÖеÄÈÎÎñ

TIDYING£ºËùÓÐÈÎÎñÖÐÖ¹£¬¶ÓÁÐΪ¿Õ£¬½øÈë¸Ã״̬ϵÄÈÎÎñ»áÖ´ÐÐ terminated()·½·¨

TERMINATED£º terminated()·½·¨Ö´ÐÐÍê³Éºó½øÈë¸Ã״̬

״̬֮¼äµÄת»»

1.RUNNING -> SHUTDOWN

µ÷ÓÃÁË shutdown()·½·¨£¬¿ÉÄÜÊÇÔÚ finalize()·½·¨Öб»Òþʽµ÷ÓÃ

2.(RUNNING or SHUTDOWN) -> STOP

µ÷ÓÃ shutdownNow()

3.SHUTDOWN -> TIDYING

µ±¶ÓÁкÍÏ̳߳ض¼Îª¿Õʱ

4.STOP -> TIDYING

Ï̳߳ØÎª¿Õʱ

5.TIDYING -> TERMINATED

terminated()·½·¨Ö´ÐÐÍê³É

Ï̳߳Ø×´Ì¬ÊµÏÖ

Èç¹û²é¿´ ThreadPoolExecutorµÄÔ´Â룬»á·¢ÏÖ¿ªÍ·¶¨ÒåÁËÕ⼸¸ö±äÁ¿À´´ú±íÏß³Ì״̬ºÍ»î¶¯Ï̵߳ÄÊýÁ¿£º

   //Ô­×Ó±äÁ¿
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;

// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;

Õâ¸öÀàÖн«¶þ½øÖÆÊý·ÖΪÁËÁ½²¿·Ö£¬¸ßλ´ú±íÏ̳߳Ø×´Ì¬£¨ runState£©£¬µÍλ´ú±í»î¶¯Ïß³ÌÊý£¨ workerCount£©£¬ CAPACITY´ú±í×î´óµÄ»î¶¯Ïß³ÌÊý£¬Îª2^29-1,ÏÂÃæÎªÁ˸üÖ±¹ÛµÄ¿´µ½ÕâЩÊýÎÒ×öÁËЩ´òÓ¡£º

public class Test1 {
public static void main(String[] args) {
final int COUNT_BITS = Integer.SIZE - 3;
final int CAPACITY = (1 << COUNT_BITS) - 1;

final int RUNNING = -1 << COUNT_BITS;
final int SHUTDOWN = 0 << COUNT_BITS;
final int STOP = 1 << COUNT_BITS;
final int TIDYING = 2 << COUNT_BITS;
final int TERMINATED = 3 << COUNT_BITS;

System.out.println(Integer.toBinaryString(CAPACITY));
System.out.println(Integer.toBinaryString(RUNNING));
System.out.println(Integer.toBinaryString(SHUTDOWN));
System.out.println(Integer.toBinaryString(STOP));
System.out.println(Integer.toBinaryString(TIDYING));
System.out.println(Integer.toBinaryString(TERMINATED));
}
}

Êä³ö£º

11111111111111111111111111111
11100000000000000000000000000000
0
100000000000000000000000000000
1000000000000000000000000000000
1100000000000000000000000000000

´òÓ¡µÄʱºò»á½«¸ßλ0Ê¡ÂÔ

¿ÉÒÔ¿´µ½£¬µÚÒ»Ðдú±íÏß³ÌÈÝÁ¿£¬ºóÃæ5ÐÐÌáÈ¡¸ß3λµÃµ½£º

111 - RUNNING
000 - SHUTDOWN
001 - STOP
010 - TIDYING
011 - TERMINATED

·Ö±ð¶ÔÓ¦5ÖÖ״̬£¬¿ÉÒÔ¿´µ½ÕâÑù¶¨ÒåÖ®ºó£¬Ö»ÐèҪͨ¹ý¼òµ¥µÄÒÆÎ»²Ù×÷¾Í¿ÉÒÔ½øÐÐ״̬µÄת»»¡£

ÖØÒª·½·¨

execute·½·¨£º

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

int c = ctl.get();
/**·ÖÈý²½Ö´ÐÐ
* Èç¹ûworkerCount<corePoolSize,Ôò´´½¨Ò»¸öÐÂÏß³ÌÖ´ÐиÃÈÎÎñ
*/
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true)) //´´½¨³É¹¦Ôòreturn
return;
c = ctl.get(); //´´½¨Ê§°ÜÖØÐ¶Áȡ״̬£¬ËæÊ±±£³Ö״̬µÄ×îÐÂ
}
/**
* workerCount>=corePoolSize,ÅжÏÏ̳߳ØÊÇ·ñ´¦ÓÚÔËÐÐ״̬£¬ÔÙ½«ÈÎÎñ¼ÓÈë¶ÓÁÐ
* */
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get(); //ÓÃÓÚdouble check
//Èç¹ûÏ̳߳ش¦ÓÚ·ÇÔËÐÐ̬£¬Ôò½«ÈÎÎñ´Ó»º´æ¶ÓÁÐÖÐɾ³ý
if (! isRunning(recheck) && remove(command))
reject(command); //¾Ü¾øÈÎÎñ
else if (workerCountOf(recheck) == 0) //Èç¹û»î¶¯Ïß³ÌÊýΪ0£¬Ôò´´½¨ÐÂÏß³Ì
addWorker(null, false);
}
//Èç¹ûÏ̳߳ز»´¦ÓÚRUNNING״̬£¬»òÕßworkQueueÂúÁË£¬ÔòÖ´ÐÐÒÔÏ´úÂë
else if (!addWorker(command, false))
reject(command);
}

¿ÉÒÔ¿´µ½£¬ÔÚÀàÖÐʹÓÃÁË WorkÀàÀ´´ú±íÈÎÎñ£¬ÏÂÃæÊÇ WorkÀàµÄ¼òµ¥ÕªÒª£º

private final class Worker extends AbstractQueuedSynchronizer
implements Runnable
{
/** Thread this worker is running in. Null if factory fails. */
final Thread thread;
/** Initial task to run. Possibly null. */
Runnable firstTask;
/** Per-thread task counter */
volatile long completedTasks;

/**
* Creates with given first task and thread from ThreadFactory.
* @param firstTask the first task (null if none)
*/
Worker(Runnable firstTask) {
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}

/** Delegates main run loop to outer runWorker */
public void run() {
runWorker(this);
}
...

WorkÀàʵÏÖÁË Runnable½Ó¿Ú£¬Ê¹ÓÃÁËÏ̹߳¤³§´´½¨Ị̈߳¬Ê¹Óà runWork·½·¨À´ÔËÐÐÈÎÎñ

´´½¨ÐÂÏß³ÌʱÓõ½ÁË addWorker()·½·¨:

/**
* ¼ì²éÔÚµ±Ç°Ï̳߳Ø×´Ì¬ºÍÏÞÖÆÏÂÄÜ·ñ´´½¨Ò»¸öÐÂỊ̈߳¬Èç¹û¿ÉÒÔ£¬»áÏàÓ¦¸Ä±äworkerCount£¬
* ÿ¸öworker¶¼»áÔËÐÐËûÃǵÄfirstTask
* @param firstTask µÚÒ»¸öÈÎÎñ
* @param core trueʹÓÃcorePoolSize×÷Ϊ±ß½ç£¬falseʹÓÃmaximumPoolSize
* @return false Ï̳߳عرջòÕßÒѾ­¾ß±¸¹Ø±ÕµÄÌõ¼þ»òÕßÏ̹߳¤³§Ã»Óд´½¨ÐÂÏß³Ì
*/

private boolean addWorker(Runnable firstTask, boolean core) {
retry:
for (;;) {
int c = ctl.get();
int rs = runStateOf(c);

// Ö»Óе±rs < SHUTDOWN²ÅÓпÉÄܽÓÊÜÐÂÈÎÎñ
if (rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
return false;

for (;;) {
int wc = workerCountOf(c); //¹¤×÷Ïß³ÌÊýÁ¿
if (wc >= CAPACITY ||
wc >= (core ? corePoolSize : maximumPoolSize)) //²»ºÏ·¨Ôò·µ»Ø
return false;
if (compareAndIncrementWorkerCount(c)) //½«¹¤×÷Ïß³ÌÊýÁ¿+1
break retry;
c = ctl.get(); // Re-read ctl
if (runStateOf(c) != rs) //ÅжÏÏ̳߳Ø×´Ì¬ÓÐûÓиı䣬¸Ä±äÁËÔò½øÐÐÍâÑ­»·£¬·ñÔòÖ»½øÐÐÄÚÑ­»·
continue retry;
// else CAS failed due to workerCount change; retry inner loop
}
}
//´´½¨ÐÂÏß³Ì
Worker w = new Worker(firstTask);
Thread t = w.thread;

final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
//Ôٴμì²é״̬£¬·ÀÖ¹ThreadFactory´´½¨Ïß³Ìʧ°Ü»òÕß״̬¸Ä±äÁË
int c = ctl.get();
int rs = runStateOf(c);

if (t == null ||
(rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null))) {
decrementWorkerCount(); //¼õÉÙÏß³ÌÊýÁ¿
tryTerminate();//³¢ÊÔÖÐÖ¹Ïß³Ì
return false;
}

workers.add(w);//Ìí¼Óµ½¹¤×÷Ïß³ÌSet¼¯ºÏÖÐ

int s = workers.size();
if (s > largestPoolSize)
largestPoolSize = s;
} finally {
mainLock.unlock();
}

t.start();//Ö´ÐÐÈÎÎñ
//״̬±ä³ÉÁËSTOP£¨µ÷ÓÃÁËshutdownNow·½·¨£©
if (runStateOf(ctl.get()) == STOP && ! t.isInterrupted())
t.interrupt();

return true;
}

ÔÙ¿´ WorkÖÐµÄ runWork·½·¨£º

final void runWorker(Worker w) {
Runnable task = w.firstTask;
w.firstTask = null;
boolean completedAbruptly = true;//Ïß³ÌÊÇ·ñÒì³£ÖÐÖ¹
try {
//ÏÈÈ¡firstTask£¬ÔÙ´Ó¶ÓÁÐÖÐÈ¡ÈÎÎñÖ±µ½Îªnull
while (task != null || (task = getTask()) != null) {
w.lock();
clearInterruptsForTaskRun();
try {
beforeExecute(w.thread, task);//ʵÏÖ¹³×Ó·½·¨
Throwable thrown = null;
try {
task.run();//ÔËÐÐÈÎÎñ
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);//ʵÏÖ¹³×Ó·½·¨
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;//³É¹¦ÔËÐУ¬ËµÃ÷ûÓÐÒì³£ÖÐÖ¹
} finally {
processWorkerExit(w, completedAbruptly);
}
}
   
1930 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

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

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

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

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¼°ÆäÇ°ÑØ¼¼Êõ