`

ThreadPoolExecutor学习

 
阅读更多
一、构造函数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)
corePoolSize 线程池维护的核心线程数。为什么这里说核心线程数而不是最小线程数是因为在线程池被创建后,并不会直接创建corePoolSize个线程,而是等任务到来时临时创建。等按照需要创建了corePoolSize个线程之后,这些数量的线程即使闲置,也不会被线程池收回。这时即可以将这个值理解为线程池维护的最小线程数了。
maximumPoolSize 线程池维护的最大线程数。
  keepAliveTime 当线程池中的线程数量大于corePoolSize,多出那部分数量的线程空闲keepAliveTime后会被收回。(线程池维护线程所允许的空闲时间)
unit keepAliveTime的时间单位。可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
  workQueue 存放通过execute方法提交给线程等待执行的任务的队列。
threadFactory 负责给线程池创建线程的工厂。
  handler 在当队列达到极限导致任务执行阻塞时执行的处理策略。handler有四个选择:ThreadPoolExecutor.AbortPolicy(抛出java.util.concurrent.RejectedExecutionException异常)。ThreadPoolExecutor.CallerRunsPolicy(重试添加当前的任务,他会自动重复调用execute方法)。ThreadPoolExecutor.DiscardOldestPolicy(抛弃旧的任务)。
  ThreadPoolExecutor.DiscardPolicy(抛弃当前的任务)。
说明:
一个任务通过execute(Runnable)方法添加到线程池,任务就是一个Runnable类型的对象,任务执行的方法就是Runnable类型对象的run()方法。

1)ThreadPoolExecutor会根据corePoolSize和maximumPoolSize的值调整线程池中线程的数量。当通过ThreadPoolExecutor.execute方法向线程池提交一个新的任务时,如果线程池当前线程数量小于corePoolSize,就算有线程空闲,也会在创建一个线程执行这个任务;如果线程池当前线程数量大于corePoolSize又小于maximumPoolSize,只有当可用线程不够的时候才会创建新的线程。如果不希望系统动态增减线程数量,则将corePoolSize和maximumPoolSize数值设置为一样的值。如果将maximumPoolSize设置为一个特别大的值如Integer.MAX_VALUE,则ThreadPoolExecutor成为了一个能够容纳大量并发任务的线程池。一般来说corePoolSize和maximumPoolSize是在构造ThreadPoolExecutor对象时设置好的,当仍然可以调用ThreadPoolExecutor.setCorePoolSize 和ThreadPoolExecutor.setMaximumPoolSize 方法修改这两个属性。

2)关于BlockQueue

当一个任务通过execute(Runnable)添加到线程池时:

a) 线程池中线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理刚添加的任务。
b) 线程池中线程数量等于于corePoolSize,但缓冲队列workQueue未满,任务放入缓冲队列
c)线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量小于maxmumPoolSize,建新的线程来处理被添加的任务
d) 线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量等于maxmumPoolSize,根据handle所指定的策略来处理任务

关于BlockQueue的选择,这篇文章分析的比较透彻
http://blog.csdn.net/feiyu8607/article/details/6872736
分享到:
评论

相关推荐

    PyQt5中多线程模块QThread和线程池ThreadPoolExecutor解决PyQt5界面程序执行比较耗时操作无响应问题

    1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时...2.适用人群:想学习PyQt5中多线程模块QThread和线程池ThreadPoolExecutor知识的人。

    Java ThreadPoolExecutor 线程池的使用介绍

    提供工厂方法来创建不同类型的线程池,这篇文章主要介绍了Java ThreadPoolExecutor 线程池的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...

    Java分布式应用学习笔记07线程池应用

    ### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...

    《IT学习资料》-Java架构师学习.zip

    你可能找到关于Java并发API的详细讲解,包括`java.util.concurrent`包下的Thread、Runnable、ExecutorService、Semaphore、CountDownLatch、CyclicBarrier、ThreadPoolExecutor等类的使用方法。此外,还可能探讨了...

    线程池学习笔记doc文档

    线程池学习笔记 线程池是 Java 中一个非常重要的概念,它可以帮助我们更好地管理线程,从而提高系统的性能和可维护性。下面是关于线程池的详细知识点。 一、线程池类 Java 中的线程池类是 `java.util.concurrent....

    java学习文档(word)

    文档可能会详细解释如何使用Java的ExecutorService和ThreadPoolExecutor类来创建线程池,以及如何配置线程池参数以优化性能。通过实际编写100行代码,读者可以亲身体验线程池的实现过程,理解其工作原理。 最后,...

    Java进阶学习资料.zip

    10. 并发工具类:如CountDownLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等,用于多线程协作和管理。 11. Java内存模型:理解JVM内存结构,包括堆、栈、方法区等,以及垃圾回收机制。 12. 性能优化:...

    Android安卓经典设计学习例程源代码-SundPoolSample.rar

    学习如何实例化并配置不同的ExecutorService,如`ThreadPoolExecutor`,以满足特定的并发需求。 3. **ThreadPoolExecutor参数**:理解`ThreadPoolExecutor`的构造函数参数,如核心线程数、最大线程数、线程存活时间...

    13-Java并发编程学习宝典.zip

    3. **Executor框架** - "20 其实不用造轮子—Executor框架详解-慕课专栏.html":讲解了Java的`ExecutorService`和`ThreadPoolExecutor`,这是管理和控制线程执行的重要工具,可以有效地管理线程池,提高系统性能。...

    38个学习android的简单例子

    18. **多线程**:了解Handler、Looper、Message机制,以及使用ThreadPoolExecutor进行并发处理。 19. **依赖注入**:如Dagger或Koin,学习如何简化组件间的依赖关系。 20. **单元测试和集成测试**:学习JUnit、...

    jvm优化学习资源学习及讲义说明

    7. **线程与锁优化**:理解线程池的配置(如ThreadPoolExecutor的corePoolSize, maximumPoolSize, keepAliveTime等参数),死锁的检测和避免,以及锁的升级过程(从偏向锁到轻量级锁再到重量级锁)。 8. **编译优化...

    java 学习资料|最适合初学者的资料,与你分享

    - **线程池**:了解ExecutorService和ThreadPoolExecutor,高效管理线程资源。 9. **Swing与JavaFX**: - **GUI编程**:使用Swing或JavaFX创建图形用户界面,学习组件布局和事件处理。 10. **JDBC**: - **...

    Java JDK1.6学习笔记

    5. **多线程**:线程的创建方式(实现Runnable接口和继承Thread类),线程同步(synchronized关键字,wait(),notify(),notifyAll()方法),线程池的使用(ExecutorService,ThreadPoolExecutor)。 6. **网络编程...

    java学习笔记,好好学习

    - **线程池**:ExecutorService和ThreadPoolExecutor的使用。 - **并发API**:如ConcurrentHashMap、CountDownLatch、CyclicBarrier等。 7. **网络编程**: - **Socket通信**:客户端和服务端的建立连接和数据...

    Python-使用微软深度学习算法对图片自动批量重命名

    Python的`concurrent.futures`库提供了并发执行任务的接口,如`ThreadPoolExecutor`和`ProcessPoolExecutor`,它们可以显著提高批处理速度。 总之,这个项目融合了Python编程、文件操作、深度学习模型应用、图像...

    java学习知识点总结

    3. 线程池:理解ExecutorService和ThreadPoolExecutor,掌握线程池的创建与管理,优化线程池参数设置。 4. 并发工具类:了解并发容器如ConcurrentHashMap、BlockingQueue等,以及CountDownLatch、CyclicBarrier、...

    java学习笔记源码MD.rar

    你需要理解线程的基本概念,如线程的创建与启动、同步与通信(synchronized、wait/notify、Lock接口等)、线程池的使用(ExecutorService、ThreadPoolExecutor)。学习这部分内容能够帮助你在处理高并发场景时设计出...

    记录一些自己学习MySQL,JUC,JVM的学习笔记.zip

    1. 线程和线程池:理解线程的基本概念,如何创建和管理线程,以及线程池的使用,如ExecutorService和ThreadPoolExecutor。 2. 同步机制:学习synchronized关键字,volatile变量,以及Lock接口和ReentrantLock类。 ...

    javaSe核心(2) 分五天学习

    - 线程池:介绍ExecutorService和ThreadPoolExecutor,优化线程管理。 在每个主题中,都会有知识讲解、案例实践以及课后练习,以帮助你更好地巩固所学内容。通过这五天的学习,你应该能够熟练掌握Java SE的核心概念...

Global site tag (gtag.js) - Google Analytics