学习下线程池,也很好奇为什么线程为什么可以复用,本来还以为是线程状态之间的切换,这样还是会导致上下文切换,影响性能(上下文切换带来的性能和线程一直运行的性能怎么去权衡?)
参考博客:https://blog.csdn.net/Prepared/article/details/71616709(线程状态和上下文切换)
https://blog.csdn.net/cjh94520/article/details/70545202/(复用原理定位)
https://www.cnblogs.com/dolphin0520/p/3932921.html(实现细节)
自己的理解,如有不正确,请给予指正

public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {//小于核心课程池
if (addWorker(command, true))
return;
c = ctl.get();
}
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);
}
else if (!addWorker(command, false))//非核心线程池
reject(command);
}
结合 newCachedThreadPool分析
构造
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
corePoolSize=0;
maximumPoolSize=Integer.MAX_VALUE
keepAliveTime=60;
TimeUnit=s;
workQueue=SynchronousQueue;newCachedThreadPool
SynchronousQueue()队列只能容纳一个任务,因此如果瞬间存在有个线程的,一定会进入创建非核心线程池的队列,非核心线程池
workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) ;超过时间得不到任务,线程就会被回收.
浙公网安备 33010602011771号