当前位置: 代码迷 >> 综合 >> java源码学习——concurrent.ExecutorService
  详细解决方案

java源码学习——concurrent.ExecutorService

热度:1   发布时间:2024-03-08 16:27:05.0

这里写目录标题

  • 介绍
  • ExecutorService种类
    • newSingleThreadExecutor——单线程化线程池
    • newFixedThreadPool——定长线程池
    • newCachedThreadPool——可缓存线程池
    • newScheduledThreadPool——支持定时及周期性任务执行的线程池

介绍

在这里插入图片描述
ExecutorService是java.util.concurrent包中的一个线程池实现接口。其有两个实现类:

1)ThreadPoolExecutor:普通线程池通过配置线程池大小,能有效管理线程的调度,在执行大量异步线程时提高程序的性能。

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||maximumPoolSize <= 0 ||maximumPoolSize < corePoolSize ||keepAliveTime < 0)throw new IllegalArgumentException();if (workQueue == null || threadFactory == null || handler == null)throw new NullPointerException();this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.workQueue = workQueue;this.keepAliveTime = unit.toNanos(keepAliveTime);this.threadFactory = threadFactory;this.handler = handler;}
  • corePoolSize:核心线程数,如果运行的线程少于corePoolSize,则创建新线程来执行新任务,即使线程池中的其他线程是空闲的
  • maximumPoolSize:最大线程数,可允许创建的线程数,corePoolSize和maximumPoolSize设置的边界自动调整池大小:
  • corePoolSize <运行的线程数< maximumPoolSize:仅当队列满时才创建新线程
  • corePoolSize=运行的线程数= maximumPoolSize:创建固定大小的线程池
  • keepAliveTime:如果线程数多于corePoolSize,则这些多余的线程的空闲时间超过keepAliveTime时将被终止
  • unit:keepAliveTime参数的时间单位
  • workQueue:保存任务的阻塞队列,与线程池的大小有关:
    当运行的线程数少于corePoolSize时,在有新任务时直接创建新线程来执行任务而无需再进队列
    当运行的线程数等于或多于corePoolSize,在有新任务添加时则选加入队列,不直接创建线程
    当队列满时,在有新任务时就创建新线程
  • threadFactory:使用ThreadFactory创建新线程,默认使用defaultThreadFactory创建线程
  • handle:定义处理被拒绝任务的策略,默认使用ThreadPoolExecutor.AbortPolicy,任务被拒绝时将抛出RejectExecutorException

2)ScheduledThreadPoolExecutor:执行延迟任务和周期性任务。

ExecutorService种类

newSingleThreadExecutor——单线程化线程池

只会用唯一的工作线程来执行任务,没有被执行的线程先排在等待队列中,而且先放入线程池的先执行
在这里插入图片描述

newFixedThreadPool——定长线程池

可控制线程最大并发数,超出的线程会在队列中等待
在这里插入图片描述

newCachedThreadPool——可缓存线程池

创建可缓存的线程池,如果线程池中的线程在60秒未被使用就将被移除,在执行新的任务时,当线程池中有之前创建的可用线程就重用可用线程,否则就新建一条线程

newScheduledThreadPool——支持定时及周期性任务执行的线程池

  • Executors.newScheduledThreadPool(int corePoolSize),corePoolSize表示线程容量。
  • schedule(Callable/Runnable command,long initialDelay,TimeUnit unit):第一个参数任务,第二个参数表示执行任务前等待的时间,第三参数表示时间单位。
  • scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit):第一个参数表示周期线执行的任务,第二个参数表示第一次执行前的延迟时间,第三个参数表示任务启动间隔时间,第四个参数表示时间单位。虽然任务类型是Runnable但该方法有返回值ScheduledFuture。可以通过该对象获取线程信息。
  • scheduleWithFixedDelay(Runnable command,long initialDelay,long period,TimeUnit unit):与scheduleAtFixedRate方法类似,不同的是第三个参数表示前一次结束的时间和下一次任务启动的间隔时间
    在这里插入图片描述

参考:https://www.cnblogs.com/boshen-hzb/p/10184036.html

  相关解决方案