共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(十四)

    public void purge() {
        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的已完成任务数相加并返回 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值