美文网首页
Java线程池(ThreadPoolExecutor)构造参数

Java线程池(ThreadPoolExecutor)构造参数

作者: 侧耳倾听y | 来源:发表于2020-12-09 17:48 被阅读0次

线程池构造参数

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
      
    }
  • corePoolSize:

核心线程数,即使闲置也会存在于线程池中,除非设置了allowCoreThreadTimeOut参数。

  • maximumPoolSize:

最大线程数,线程池最大的线程数量

  • keepAliveTime:

闲置线程存活时间

  • TimeUnit:

时间单位

  • BlockingQueue:

工作队列

  • ThreadFactory:

生成线程的工厂

  • RejectedExecutionHandler:

拒绝策略

提交任务逻辑

当有新任务提交到线程池,
1 若当前线程数 < corePoolSize,会新建一个线程;
2 当前线程数 < maximumPoolSize,会加入工作队列;
3 当前线程数 < maximumPoolSize,且工作队列满了,会新建一个线程;
4 当前线程数 = max 且工作队列满了,会执行拒绝策略。
线程数 > corePoolSize时,多于的线程会在闲置keepAliveTime后被终止。

工作队列

  • ArrayBlockingQueue

有界队列,适合有限的maximumPoolSize

  • LinkedBlockingQueue

默认是无界的队列(也可限制队列长度),适用于线程数固定的池子

  • SynchronousQueue

无界队列,不会持有任务,适合maximumPoolSize为无界

常见线程池

  • newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

corePoolSize = maximumPoolSize,使用无界队列,超过nThreads数量的任务,会在队列中等待。

  • newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

corePoolSize = 1,maximumPoolSize = 1,使用无界队列

  • newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,使用无界队列

拒绝策略

  • AbortPolicy

抛出异常到主线程

  • DiscardPolicy

删除无法执行的任务

  • DiscardOldestPolicy

删除队列中最早的任务

  • CallerRunsPolicy

主线程执行(该策略提供了简单的反馈控制机制,可以减缓新任务的提交速度)

相关文章

网友评论

      本文标题:Java线程池(ThreadPoolExecutor)构造参数

      本文链接:https://www.haomeiwen.com/subject/ajnhgktx.html