美文网首页
线程池的超时参数

线程池的超时参数

作者: 约翰886 | 来源:发表于2018-04-12 17:29 被阅读0次
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }

在ThreadPoolExecutor方法的参数注释中keepAliveTime是这样说的:

when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.

就是线程数大于corePoolSize时空闲线程存活的最大时间。在方法getTask中就可明白具体是怎么实现的。

private Runnable getTask() {

        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {

            int c = ctl.get();

            int rs = runStateOf(c);

            // Check if queue empty only if necessary.

            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {

                decrementWorkerCount();

                return null;

            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?

            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))

                && (wc > 1 || workQueue.isEmpty())) {

                if (compareAndDecrementWorkerCount(c))

                    return null;

                continue;

            }

            try {

                Runnable r = timed ?

                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :

                    workQueue.take();

                if (r != null)

                    return r;

                timedOut = true;

            } catch (InterruptedException retry) {

                timedOut = false;

            }

        }

    }

注意到工作线程数wc大于corePoolSize或allowCoreThreadTimeOut为true时timed为true。

boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

poll方法超时后timeOut变为true。

 Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;

在下一次循环中下面判断条件为真,执行了compareAndDecrementWorkerCount方法,当前线程跳出循环。

 if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

getTask返会null后,执行了processWorkerExit方法,当前Worker被移除。

 workers.remove(w);

相关文章

  • 线程池的超时参数

    在ThreadPoolExecutor方法的参数注释中keepAliveTime是这样说的: when the n...

  • Java线程总结 之 ThreadPool 线程池

    线程脑图 ThreadPool 线程池 线程池的构造参数 ----------------------------...

  • 面试问题汇总

    Zxing扫描优化 http超时返回 线程池种类 sql注入 原理 解决办法 摄像头参数设置 更新UI的几种方式 ...

  • java基础-多线程

    java线程池的实现 ThreadPoolExecutor java线程池几个参数 corePoolSize当线程...

  • 线程池知识个人总结及源码分析

    1 ThreadPoolExecutor 该线程池是比较常用的线程池。参数如下: 参数名解释corePoolSiz...

  • 线程池概述

    为什么要使用线程池? 线程池核心参数 线程池的几种拒绝策略 execute()和submit()的区别 线程池工作...

  • 线程池核心参数

    线程池核心参数 1)corePoolSize(线程池基本大小) 2)maximumPoolSize(线程池最大数量...

  • ThreadPool

    线程池核心参数 corePoolSize: int 核心线程数 线程池初始化后,线程池中没有任何线程,线程池会等待...

  • Android 线程池原理

    线程池核心类 : ThreadPoolExecutor:提供了一系列参数来配置线程池 线程池优点: 1.重用线程池...

  • 实战! 多线程线程池分析

    一 项目线程池运用 二 线程池代码分析 线程池参数这里面的参数分别为初始线程数3,最大线程数6,线程存活时间0毫秒...

网友评论

      本文标题:线程池的超时参数

      本文链接:https://www.haomeiwen.com/subject/yprfkftx.html