Java线程池(ThreadPoolExecutor)构造参数

2020-12-09  本文已影响0人  侧耳倾听y

线程池构造参数

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

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

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

闲置线程存活时间

时间单位

工作队列

生成线程的工厂

拒绝策略

提交任务逻辑

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

工作队列

有界队列,适合有限的maximumPoolSize

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

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

常见线程池

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

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

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

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

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

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

拒绝策略

抛出异常到主线程

删除无法执行的任务

删除队列中最早的任务

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

上一篇下一篇

猜你喜欢

热点阅读