`

java 线程池的理解(ThreadPoolExecutor)

    博客分类:
  • Java
阅读更多

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              RejectedExecutionHandler handler)

corePoolSize:控制单次并行线程最小数;

workQueue:缓存待运行线程(线程数量 n);

maximumPoolSize:workQueue队列已满,外部依然在添加线程,则生成新的线程将直接运行,可执行线程数量为 maximumPoolSize-corePoolSize;如果外部还在继续添加线程,则这些新线程被直接抛弃。。。

keepAliveTime:控制空闲线程闲置时长『实际是针对corePoolSize的线程闲置时间的控制,所以说线程重用应该是针对第一批启动线程』

workQueue:ArrayBlockingQueue,DelayedWorkQueue,DelayQueue,LinkedBlockingQueue,

PriorityBlockingQueue,SynchronousQueue

handler:RejectedExecutionHandler 四种方式

             其中 DiscardPolicy  表示拒绝任务但不做任何动作;

             DiscardOldestPolicy 表示先抛弃队列中等待最久的闲置线程,取最新加入队列的线程运行,有点像FIFO

CallerRunsPolicy  如果线程池内活动线程数达到maximumPoolSize,如果此时还有并发任务数还在迅速增大,线程池会使用调用者的线程执行任务,如果有执行时间很长的任务并发,要慎用该策略

补充:
java线程池(java.util.concurrent.ThreadPoolExecutor)及其策略的使用一点提醒

例如我们并发任务数是100

_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
                                           new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());

上面例子中使用了无界队列,将会把任务都执行完,但是任务调度花费的时间会长

_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
                                           new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.DiscardOldestPolicy());

上面例子中使用了有界队列,任务只能执行80个,有20个被抛弃,任务调度时间很快

如果将最大线程数和队列最大有限容量的和设置为大于或等于100,任务可以执行完,任务调度时间很快,任务调度时间有二个值影响:

corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
corePoolSize起决定作用,maximumPoolSize其次

如果使用有界队列,DiscardOldestPolicy策略使用时候需要注意的是maximumPoolSize和队列容量之和要不小于最大并发数,否则当任务并发数达到最大时你的任务可能被丢弃。

 

分享到:
评论

相关推荐

    深入理解Java线程池:ThreadPoolExecutor _ Idea Buffer1

    1. RUNNING :能接受新提交的任务,并且也能处理阻塞队列中的任务 2. SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保

    Java线程池文档

    Reference: 《创建Java线程池》[1],《Java线程:新特征-线程池》[2], 《Java线程池学习》[3],《线程池ThreadPoolExecutor使用简介》[4],《Java5中的线程池实例讲解》[5],《ThreadPoolExecutor使用和思考》[6] ...

    11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    java线程池概念.txt

     corePoolSize在很多地方被翻译成核心池大小,其实我的理解这个就是线程池的大小。举个简单的例子:  假如有一个工厂,工厂里面有10个工人,每个工人同时只能做一件任务。  因此只要当10个工人中有工人是空闲的...

    13、线程池ForkJoinPool实战及其工作原理分析(1).pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    深入理解Java之线程池

    在前面的文章中,我们...我们来详细讲解一下Java的线程池,首先我们从核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,后讨论了一下如何合理配置线程池的大小。  以下是

    深入理解Java编程线程池的实现原理

    主要介绍了深入理解Java编程线程池的实现原理,涉及ThreadPoolExecutor类,线程池实现原理及示例等相关内容,具有一定参考价值,需要的朋友可以了解下。

    16、常用并发设计模式精讲(1).pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    15、CPU缓存架构详解&高性能内存队列Disruptor实战(1).pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    designpattern.zip

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    forkjoin.zip

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    disruptor.zip

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    jmm(1).zip

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    ArchKnowledgeTree:架构师知识谱系梳理,包含Java core, JUC, JVM, MySQL,MQ, redis,分布式相关等各种知识点整理。是我按个人理解学习、整理出的一个知识库

    ArchKnowledgeTree ... 源码分析之Java线程池ThreadPoolExecutor 常见工具 [源码分析之Guava RateLimiter源码分析](source_code/源码分析之Guava RateLimiter源码分析.md) 源码分析之netty线程模型 Mes

    Java并发编程基础.pdf

    线程池:了解Java中的线程池概念,如ExecutorService和ThreadPoolExecutor,它们用于管理线程的创建、销毁和复用,以提高系统性能。 并发工具类:掌握Java并发包java.util.concurrent中提供的各种工具类,如...

    【2018最新最详细】并发多线程教程

    21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类总结 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier 26....

    J2SE技术总结-Java学习精华教程-电子书

    本书内容非常全面,涵盖了《Java编程思想》、《Java学习笔记》等书籍所有知识要点,并结合作者自己...线程池-ThreadPoolExecutor .....反射 ..........概述 ..........Class类 ..........类的加载 ..........操作对象

    深入理解高并发编程-核心技术原理

    (2) 深度解析ThreadPoolExecutor类源码 (3) 从源码角度分析创建线程池究竟有哪些方式 2、基础案例篇 (1) 导致并发编程频繁出问题的“幕后黑手” (2)工作了3年的程序员小菜面试高并发岗位被吊打虐哭 (3)如何解决可见...

Global site tag (gtag.js) - Google Analytics