线程池

1、线程核心核心类ThreadPoolExecutor

ThreadPoolExecutor构造方法

corePollSize:核心线程数,任务提交时,若当运行的线程数小于核心线程数,则启动核心线程运行任务,大于或等于核心线程数则在任务队列中等待

maximumPoolSize:允许运行的最大线程数,如果任务队列满了,且运行线程数小于最大线程数,则会创建非核心线程运行

keepAliveTime:非核心线程超时时间,线程等待时间超过该时间则系统回收该线程,如果设置allowCoreThreadTimeout为True时,超时机制也应用在核心线程上

unit:时间单位,workQueue:任务队列,threadFactory:线程工厂,用来给创建的线程取名,handler:饱和策略,当运行的线程数量大于队列容量加允许运行线程数时,执行该策略,抛异常。

线程池执行流程

2、线程池分类

1)  FixedThreadPool:可重用固定线程数的线程池:

FixedThreadPool构造方法

当执行execute方法时,如果当前运行的线程未达到corePoolSize(核心线程数)时就创建核心线程来处理任务,如果达到了核心线程数则将任务添加到LinkedBlockingQueue(无界的阻塞队列)中。FixedThreadPool就是一个有固定数量核心线程的线程池,并且这些核心线程不会被回收。当线程数超过corePoolSize 时,就将任务存储在任务队列中;当线程池有空闲线程时,则从任务队列中去取任务执行。执行长期的任务,性能好很多。

2)CachedThreadPool:是一个根据需要创建线程的线程池

CachedThreadPool构造方法

CachedThreadPool没有核心线程,非核心线程是无界的。keepAliveTime设置为60L,则空闲线程等待新任务的最长时间为 60s。在此用了阻塞队列 SynchronousQueue,它是一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作,同样任何一个移除操作都等待另一个线程的插入操作。如果提交的任务大于线程池中线程处理任务的速度就会不断地创建新线程。另外,每次提交任务都会立即有线程去处理。所以,CachedThreadPool 比较适于大量的需要立即处理并且耗时较少的任务。

3)singleThreadExecutor:单个线程工作的线程池:

singleThreadExxcutor构造方法

当执行execute方法时,如果当前运行的线程数未达到核心线程数,也就是当前没有运行的线程,则创建一个新线程来处理任务。如果当前有运行的线程,则将任务添加到阻塞队列LinkedBlockingQueue中。因此,SingleThreadExecutor能确保所有的任务在一个线程中按照顺序逐一执行。适用:一个任务一个任务执行的场景

4)scheduledThreadPool:能实现定时和周期性任务的线程池。

ScheduledThtradPool运行流程

当执行 ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 或者 scheduleWithFixedDelay方法时,会向DelayedWorkQueue 添加一个 实现 RunnableScheduledFuture 接口的ScheduledFutureTask(任务的包装类),并会检查运行的线程是否达到 corePoolSize。如果没有则新建线程并启动它,但并不是立即去执行任务,而是去 DelayedWorkQueue 中取ScheduledFutureTask,然后去执行任务。如果运行的线程达到了corePoolSize时,则将任务添加到DelayedWorkQueue中。DelayedWorkQueue会将任务进行排序,先要执行的任务放在队列的前面。其跟此前介绍的线程池不同的是,当执行完任务后,会将ScheduledFutureTask中的time变量改为下次要执行的时间并放回到DelayedWorkQueue中。适用:周期性执行任务的场景。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 1,216评论 0 2
  • 什么是线程池 线程池,顾名思义就是装线程的池子。其用途是为了帮我们重复管理线程,避免创建大量的线程增加开销,提高响...
    lovesong_8228阅读 257评论 0 3
  • 线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任...
    安仔夏天勤奋阅读 1,039评论 0 10
  • 什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...
    Czppp阅读 164评论 0 0
  • 1 风筝是一个特别害羞的姑娘,看起来而已。过完24岁生日的时候,她妈带她来到了我们县城里刚开的咖啡馆里,请她喝一杯...
    不死终会出头_53ca阅读 464评论 0 1