java线程池移除线程_Java线程池ThreadPoolExecutor中workers.remove(w)疑惑

在查看Java线程池实现的源码时,对于线程池内部worker生命周期有一个不解的地方:当worker所持有的task,或者线程队列中的task都被执行完以后,为什么worker要被移除线程池的worker集合。

追踪源码的过程大致是:

查看execute(Runnable command)方法,发现了addWorker(command, true)的调用

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);

进入addWorker(Runnable firstTask, boolean core),发现了worker线程的启动

if (workerAdded) {

t.start();

workerStarted = true;

}

Worker类的run方法即调用ThreadPoolExecutor中的runWorker方法。

在runWorker方法的最后调用了processWorkerExit方法。

} finally {

processWorkerExit(w, completedAbruptly);

}

在processWorkerExit中发现:

final ReentrantLock mainLock = this.mainLock;

mainLock.lock();

try {

completedTaskCount += w.completedTasks;

workers.remove(w);

} finally {

mainLock.unlock();

}

worker被从线程集合workers移除了。

所以疑惑或者问题是:

线程持中其实是不保有一定数量可用线程,如果当task队列里面没有要处理的任务,原先创造的worker工作线程都会逐步被移除,直到下次再有新的task到来,才又会创建新的worker工作线程??

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值