JDK1.8 线程池源码解析

2018-11-13  本文已影响106人  南风nanfeng

1.线程池目的

2.线程池核心参数

核心类ThreadPoolExecutor实现了线程池。

线程池原理流程图.png

当任务提交给线程池,判断可运行的线程数是否达到corePoolSize,未达到,则创建新的线程处理请求,即使当前线程空闲。如果当前线程数多余corePoolSize,小于maximumPoolSize,这是要看工作队列负荷,如果工作队列已满,则创建新的线程处理请求,反之,则加入工作队列。当corePoolSize和maximumPoolSize相等,创建的是固定数量线程池。corePoolSize和maximumPoolSize在构造方法中创建,也可以通过set方法修改。

默认的,请求达到是才创建corePoolSize的请求。也可以通过重写prestartCoreThread或者prestartAllCoreThreads方法,预先创建corePoolSize的线程。

另外,加入工作队列有三种策略:
第一、直接传递,如SynchronousQueue,转手一次请求然后交给现成执行,并不会真的存储请求,当然如果没有现成立刻响应请求,则加入队列失败,因此必须创建新的现成来响应请求。这种策略要求maximumPoolSize是无界的,避免执行拒绝策略。坏处是,线程可能会无节制的增加。

第二、无界队列,如LinkedBlockingQueue,corePoolSize满了请求就会被加到无界队列,不会有超过corePoolSizede的线程数,maximumPoolSize就失效了。

第三、有界队列,如ArrayBlockingQueue,有界队列避免无节制的队列长度和无效的maximumPoolSize,Queue size和maximumPoolSize调节达到平衡。如长队列和少的线程池,降低cpu利用率、os资源利用和上下文切换开销,但是吞吐量上不去。

上一篇 下一篇

猜你喜欢

热点阅读