Java多线程问题总汇程序员Java学习笔记

ThreadPoolExecutor的用法

2018-01-10  本文已影响2503人  jqdywolf

Java中的线程池

1. 工作原理

如图所示:


ThreadPoolExecutor工作原理

当主线程中调用execute接口提交执行任务时:
则执行以下步骤:
注意:线程池初始时,是空的。

  1. 如果当前线程数<corePoolSize,如果是则创建新的线程执行该任务
  2. 如果当前线程数>=corePoolSize,则将任务存入BlockingQueue<Runnable>
  3. 如果阻塞队列已满,且当前线程数<maximumPoolSize,则新建线程执行该任务。
  4. 如果阻塞队列已满,且当前线程数>=maximumPoolSize,则抛出异常RejectedExecutionException,告诉调用者无法再接受任务了。
注意点:
提问:这里的阻塞队列是BlockingQueue<Runnale>,我们知道ThreadPoolExecutor是支持Callable任务提交的,那这里不会有问题吗?

2. 我们来看一下ThreadPoolExecutor的参数

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);

3. 阻塞队列的常用实现类

4. RejectedExecutionHandler线程池饱和策略

5. ThreadPoolExecutor的扩展

我们看ThreadPoolExecutor的源码发现如下三个函数的实现为空且是protected。明显用于子类实现的。

protected void beforeExecute(Thread t, Runnable r) { }  
protected void afterExecute(Runnable r, Throwable t) { }  
protected void terminated() { } 
上一篇 下一篇

猜你喜欢

热点阅读