java的线程池通过 AtomicInteger 即原子整型来控制线程池的执行过程,其中前 3 位表示线程池的状态,后 29 位表示该线程池的最大线程数,具体如下:
RUNNING
111 0~0
该状态接收新任务,并处理 workQueue 中的任务
SHUTDOWN
000 0~0
收尾,不接受新任务,但是处理掉 workQueue中的任务
STOP
001 0~0
既不接收新任务,也不处理 workQueue 中的任务,同时执行中的任务马上中断
TIDYING
010 0~0
所有的任务结束,workercount 是0,进入该状态的线程会执行 terminated() 方法
TERMINATED
011 0~0
terminated() 执行完后进入该状态
线程池是异步执行模式
execute() 异步
submit() 可异步,可同步
同步:pool.submit(new Myrun(4)).get();
考察过程的代码如下:
public classExcuteTest {public static voidmain(String[] args) {
ThreadPoolExecutor pool= (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
pool.execute(new Myrun(1));
pool.execute(new Myrun(2));
pool.execute(new Myrun(3));
pool.execute(new Myrun(4));
pool.shutdown();
}static class Myrun implementsRunnable{inti;
Myrun(inti){this.i =i;
}public voidrun() {
System.out.println(Thread.currentThread().getName()+ " : " +i);
}
}
}
执行并进入pool.execute( r ) 方法
----------------------------------------------------------------------
首先判断:worker数 < corepoolsize 即当前的 worker 数是否小于传入的最大线程数
有两种情况:
case 1:true
执行并进入 addworker( r ) 即把 r 添加到 workers 中
1、首先创建worker对象 w ,包含:
firstTask:即 r 对象
thread
2、worker.add( w)
3、t.start() 即启动 worker 分线程,运行 runworker( w ) 方法
注:该线程池最终的线程数即为 worker 数
执行并进入 runworker( w ) 中
首先,取出初始任务,task = w.firstTask
进入任务执行循环中,并传入task
--------------------------------------------------------
| while( task != null || ( task=getTask()) != null )) { 注:getTask() 从 workQueue 中取出任务:workQueue.take()
| task.run(); 即执行自定义的 run() 方法
| }
case 2:false
workerQueue.offer( r ) 把新增的任务即 Runnable 对象添加到 workQueue 中即 BlockingQueue, 通过 getTask() 获取任务并执行
其他:
若没有 pool.shutdown(); 则会在 workQueue.take() 阻塞,直到有元素可取.