线程池(1)ThreadPoolExecutor梳理

使用默认的 thread factory创建ThreadPoolExecutor实例

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

例子:

//创建阻塞队列
        BlockingQueue<Runnable> blockQueue = new ArrayBlockingQueue<Runnable>(20);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,50,TimeUnit.MILLISECONDS,blockQueue);
        pool.allowCoreThreadTimeOut(false);//默认false
        Runnable task = new Runnable() {
            @Override
            public void run() {
                log.info("{}正在运行", Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        pool.execute(task);
        
        pool.shutdown();

参数解释:

corePoolSize:线程池中的核心线程数

maximumPoolSize:线程池中的最大线程数

keepAliveTime:

  • 当allowCoreThreadTimeout=false(默认)时,超过corePool的线程空闲的时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=corePoolSize。因此,
  • corePool的线程数,是固定的且永久有效的。即,即使当前没有需要执行的任务,也依然存活
  • 当allowCoreThreadTimeout=true时,包含corePool线程的所有线程的空闲时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=0。因此,
  • 线程池中的线程数<指定的corePool线程数时,当有新任务来时,即使有空闲线程,也会优先创先新线程来处理该任务,直到线程数=指定的corePool线程数。

workQueue:

  • 保存由execute方法提交的Runnable任务。
  • 阻塞队列分类:
    • ArrayBlockingQueue:FIFO。
    • LinkedBlockingQueue:FIFO。Executors.newFixedThreadPool使用该阻塞队列
    • SynchronousQueue:不存储任务。Executors.newCachedThreadPool使用该阻塞队列。

执行顺序

当线程数<指定corePool线程数时,创建线程。

当线程数>=指定corePool线程数,且任务队列未满时,将任务放入workQueue。

当线程数>=指定corePool线程数,且任务队列已满时,

  • 若线程数 < maximumPoolSize,则,创建线程
  • 若线程数 = maximumPoolSize,则,执行下边的handler,默认AbortPolicy即抛出异常。

还有1种情况会执行下边的handler,即:当执行shutdown();后,新进来的任务,就会被拒绝,此时调用handler。

handler:(ThreadPoolExecutor类中的几个内部实)

  • AbortPolicy(默认):丢弃任务,抛出RejectedExecutionException异常
  • DiscardPolicy:也是丢弃任务,但不抛出异常
  • DiscardOldestPolicy:对被拒绝的任务(新来的)不抛弃,而是抛弃队列里面等待最久的一个任务,然后把该拒绝任务加到队列
  • CallerRunsPolicy:重试添加当前被拒绝的任务,他会自动重复调用 execute() 方法,直到成功。

---------------------------最后,说下关闭

shutdown():平滑地关闭

  • 不会立即终止线程池
  • 停止接收新任务,并等待执行已提交的任务。已提交的任务=一类是已经在执行的+另一类队列中还没执行的。
  • 如果是服务器的,则不调用shutdown方法,即一直执行。

shutdownNow():立即关闭

  • 立即终止线程池
  • 停止接收新任务,已提交的任务直接打断,并清空缓存队列
  • 返回尚未执行的任务列表(Runnable List)
原文地址:https://www.cnblogs.com/yaoyuan2/p/9606267.html