美文网首页
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