【线程池】toString
2021-03-15 19:32
标签:nstat ica loading super 哪些 less complete one nts 一般我们常见的线程池异常如上所示。 看一下这段日志的输出参数是怎么构成的: 进一步的我们检查ThreadPoolExecutor的toString: 我们从这里的日志入手看一下各个参数分别对应哪些情况: 1.首先是active,这里有个比较关键的参数是Worker里面的state,为!=0(lock)的时候才被认为是active的: 对应到代码是处于这些状态的worker: 2.其次是workerqueue和workers的区别,wokerquue就是我们在构造线程池的时候传入的参数,workers指不在队列的那些任务对应一个线程但不一定是active的。 pool size取的就是workers。 3.queued task直接就是wokerqueue的大小 4.completed tasks是每结束一个任务都会增加的 出现active线程数小于core的原因: 【线程池】toString 标签:nstat ica loading super 哪些 less complete one nts 原文地址:https://www.cnblogs.com/lccsblog/p/13994364.htmljava.util.concurrent.RejectedExecutionException: Task com.personal.practice.jvm.Jstacktest$1@7d605a5a rejected from java.util.concurrent.ThreadPoolExecutor@722c41f4[Running, pool size = 20, active threads = 20, queued tasks = 10, completed tasks = 10]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
/**
* Returns a string identifying this pool, as well as its state,
* including indications of run state and estimated worker and
* task counts.
*
* @return a string identifying this pool, as well as its state
*/
public String toString() {
long ncompleted;
int nworkers, nactive;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
ncompleted = completedTaskCount;
nactive = 0;
nworkers = workers.size();
for (Worker w : workers) {
ncompleted += w.completedTasks;
if (w.isLocked())
++nactive;
}
} finally {
mainLock.unlock();
}
int c = ctl.get();
String rs = (runStateLessThan(c, SHUTDOWN) ? "Running" :
(runStateAtLeast(c, TERMINATED) ? "Terminated" :
"Shutting down"));
return super.toString() +
"[" + rs +
", pool size = " + nworkers +
", active threads = " + nactive +
", queued tasks = " + workQueue.size() +
", completed tasks = " + ncompleted +
"]";
}