[java]Executors和ThreadPoolExecutor分析

版权声明:本文为博主原创文章,未经博主允许不得转载。有任何问题请邮件联系[email protected] https://blog.csdn.net/drdongshiye/article/details/85474002

1.Java通过Executors提供四种线程池,分别为:
1)newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4)SingleThreadPool 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

阿里规范上说
(1)newFixedThreadPool 和SingleThreadPool
堆积的请求队列会造成内存增大,甚至OOM
(2)newCachedThreadPool 和newScheduledThreadPool
最大线程量 Integer.MAX_VALUE ,可能引发OOM

查看 Executors源码发现
内部都是由ThreadPoolExecutor实现
那么重点就放在ThreadPoolExecutor上线
1.主要参数
int corePoolSize, 核心线程量
int maximumPoolSize, 最大线
long keepAliveTime, 空闲线程最大
TimeUnit unit, 空闲时间单位
BlockingQueue workQueue, 阻塞队列
ThreadFactory threadFactory, 定义线程工厂
RejectedExecutionHandler handler 饱和策略;当线程和队列满时处理新任务方案
execute()方法

 public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        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);
    }

更多内容请看 https://juejin.im/post/5c230613518825403339965e

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/85474002