final BlockingQueue<Runnable> q = workQueue;
try {
Iterator<Runnable> it = q.iterator();
while (it.hasNext()) {
Runnable r = it.next();
if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
it.remove();
}
} catch (ConcurrentModificationException fallThrough) {
for (Object r : q.toArray())
if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
q.remove(r);
}
tryTerminate();
}
这个方法是将每个每个被取消的worker都清除的方法
用Iterator遍历workQueue 然后将判断每个worker是否是被取消的状态 如果worker是Future类型且被取消 就调用remove方法删除 在catch块里 也会调用同样的逻辑 进行删除
最后调用tryTerminate方法关闭线程池
public int getPoolSize() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
return runStateAtLeast(ctl.get(), TIDYING) ? 0
: workers.size();
} finally {
mainLock.unlock();
}
}
这个是返回线程池大小的方法
先用mainLock锁定
然后判断状态 如果状态是TIDYING也就是整理中的状态 就返回0 否则返回worker的数目
最后用mainLock解锁
public int getActiveCount() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
int n = 0;
for (Worker w : workers)
if (w.isLocked())
++n;
return n;
} finally {
mainLock.unlock();
}
}
这是返回活跃worker的数目
调用mainLock锁定
创建计数器变量n
遍历worker的集合 就是那个HashSet 判断如果某个worker被锁定 就自增计数器
最后mainLock解锁
public int getLargestPoolSize() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
return largestPoolSize;
} finally {
mainLock.unlock();
}
}
返回largestPoolSize的方法 就是最大池容量的方法
先用mainLock锁定 然后返回largestPoolSize成员变量 然后解锁mainLock
public long getTaskCount() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
long n = completedTaskCount;
for (Worker w : workers) {
n += w.completedTasks;
if (w.isLocked())
++n;
}
return n + workQueue.size();
} finally {
mainLock.unlock();
}
}
这个是返回任务数的方法
先用mainLock锁定
然后获取completedTaskCount变量的值 赋给计数器n 作为计数器初始值 因为已经完成的任务也要算在内
然后遍历workers 计数器加上每个worker的已完成任务数 判断如果该worker是锁定状态 也就是正在执行任务的状态 给计数器再加一
返回计数器和workQueue的相加值 因为workQueue是任务队列 是尚未分配的任务
最后mainLock解锁
public long getCompletedTaskCount() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
long n = completedTaskCount;
for (Worker w : workers)
n += w.completedTasks;
return n;
} finally {
mainLock.unlock();
}
}
这个是返回已完成任务数 就是将每个worker的已完成任务数相加并返回