问题:
1.线程池是怎么保证他的核心线程不释放 而一直等待任务的执行的呢?
2.我们一直理解的线程run方法执行完毕线程就销毁是不正确的?
3.还有我们为何通过设置allowCoreThreadTimeOut(true) 就能使核心线程销毁的呢?
答案:
1.线程阻塞
2.和那个关系不大
3.可以的
有兴趣的话,可以看看下面的源码分析:
从 exexute 方法开始:
public void execute(Runnable command) {
//如果提交的任务为null 抛出异常
if (command == null)
throw new NullPointerException();
// 线程池是通过Integer类型的 高3位 表述当前线程池的状态RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED 。
// 低29位表示当前线程的运行任务数量。然后通过位运算来计算运行状态和任务的数量。
int c = ctl.get();
//1.如果当前的任务数小于等于设置的核心线程大小,那么调用addWorker直接执行该任务
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
//2.如果当前的任务数大于设置的核心线程大小,而且当前的线程池状态时运行状态,那么向阻塞队列中添加任务
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
//3.如果向队列中添加失败,那么就新开启一个线程来执行该任务
else if (!addWorker(command, false))
reject(command);
}
下面看看 addWorker 方法:
private boolean addWorker(Runnable firstTask, boolean core) {
retry:
//一直尝试,
for (;;) {
int c =