当任务提交给ThreadPoolExecutor 线程池中
- 先检查核心线程数是否已经全部使用,如果没有交由核心线程去执行任务
- 如果核心线程数已经全部占用,则将任务添加到队列里面
- 如果队列已经占满,比较当前线程池的中线程的数量是不是与超过maximumPoolSize
- 如果没有查过则创建线程去执行,也就是说线程池最多可以接受多少任务呢?就是maximumPoolSize+队列的大小。
- 当线程池中的线程的数量大于corePoolSize数量有空闲线程则执行回收,回收时间是keepAliveTime,单位是unit,都是初始化的时候设置的。
//三种阻塞队列:
BlockingQueue<Runnable> workQueue = null;
workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界
//四种拒绝策略:
RejectedExecutionHandler rejected = null;
rejected = new ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务抛出异常
rejected = new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务不异常
rejected = new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删,之后再尝试加入队列
rejected = new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败,那么主线程会自己去执行该任务
//五种线程池:
ExecutorService threadPool = null;
threadPool = Executors.newCachedThreadPool();//有缓冲的线程池,线程数 JVM 控制
threadPool = Executors.newFixedThreadPool(3);//固定大小的线程池
threadPool = Executors.newScheduledThreadPool(2);
threadPool = Executors.newSingleThreadExecutor();//单线程的线程池,只有一个线程在工作
threadPool = new ThreadPoolExecutor();//默认线程池,可控制参数比较多
多线程编程基础知识:
/**
了解JDK Executors线程池吗?
知道JDK提供了哪些默认的实现吗?
看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?
你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?
你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?
线程池里面的任务是IO密集型的还是计算密集型的呢?
好,现在我们有一个自定义线程池了,来说一下你这个线程池的工作流程呗?
那你这个线程池满了怎么办呀?拒绝?咋拒绝?有哪些拒绝策略呢?
别紧张,随便说两个就行。
*/