java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > ThreadPoolExecutor解读

Java多线程中的ThreadPoolExecutor解读

作者:「已注销」

这篇文章主要介绍了Java多线程中的ThreadPoolExecutor解读,线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行,需要的朋友可以参考下

corePoolSize

线程池中的核心线程数。当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行。

maximumPoolSize

线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize。

keepAliveTime

线程空闲时的存活时间。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,keepAliveTime参数也会起作用,直到线程池中的线程数为0。

unit

keepAliveTime参数的时间单位。

workQueue

任务缓存队列,用来存放等待执行的任务。如果当前线程数为corePoolSize,继续提交的任务就会被保存到任务缓存队列中,等待被执行。 一般来说,这里的BlockingQueue有以下三种选择:

1.SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于被处理的速度),可能出现无限制的线程增长。

2.LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,其容量为Integer.MAX_VALUE,即为无界队列。因此,如果线程池中线程数达到了corePoolSize,且始终没有空闲线程(任务提交的平均速度快于被处理的速度),任务缓存队列可能出现无限制的增长。

3.ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。

threadFactory

线程工厂,创建新线程时使用的线程工厂。

handler

任务拒绝策略,当阻塞队列满了,且线程池中的线程数达到maximumPoolSize,如果继续提交任务,就会采取任务拒绝策略处理该任务,线程池提供了4种任务拒绝策略:

1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;

2.CallerRunsPolicy:由调用execute方法的线程执行该任务;

3.DiscardPolicy:丢弃任务,但是不抛出异常;

4.DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。 当然也可以根据应用场景实现RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务。

public static void main(String[] args) {
    int corePoolSize = 0;
    int maximumPoolSize = 0;
    long keepAliveTime = 0;
    TimeUnit unit = TimeUnit.SECONDS;
    //1.SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,
    //否则插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于被处理的速度),
    //可能出现无限制的线程增长。
    //2.LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,
    //其容量为Integer.MAX_VALUE,即为无界队列。因此,如果线程池中线程数达到了corePoolSize,
    //且始终没有空闲线程(任务提交的平均速度快于被处理的速度),任务缓存队列可能出现无限制的增长。
    //3.ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。
    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
    ThreadFactory threadFactory = new ThreadFactory() {
      @Override
      public Thread newThread(Runnable r) {
        return new Thread("newThread");
      }
    };
    //1.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;
    //2.CallerRunsPolicy:由调用execute方法的线程执行该任务;
    //3.DiscardPolicy:丢弃任务,但是不抛出异常;
    //4.DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。
    RejectedExecutionHandler handler = new RejectedExecutionHandler() {
      @Override
      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
      }
    };
    ThreadPoolExecutor threadPoolExecutor = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime,
            unit, 
            workQueue);
    ThreadPoolExecutor threadPoolExecutor1 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime,
            unit, 
            workQueue, 
            threadFactory);
    ThreadPoolExecutor threadPoolExecutor2 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime, 
            unit, 
            workQueue, 
            handler);
    ThreadPoolExecutor threadPoolExecutor3 = 
        new ThreadPoolExecutor(
            corePoolSize, 
            maximumPoolSize, 
            keepAliveTime, 
            unit, 
            workQueue, 
            threadFactory, 
            handler);
  }

到此这篇关于Java多线程中的ThreadPoolExecutor解读的文章就介绍到这了,更多相关ThreadPoolExecutor解读内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文