为什么会有线程池?
在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行结束后不被销毁,而是可以继续执行其他任务。

常见的几种线程池
1.newSingleThreadExecutor:创建一个单线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级);
2.newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3.newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
4.newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。

参数:

corePoolSize :核心线程数。线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会 被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。
maximumPoolSize :最大线程数,线程中最多能够创建的线程数量。什么时候会创建:当线程数大于等于核心线程数,且任务队列已满
keepAliveTime :空闲的线程保留的时间。
TimeUnit:空闲线程的保留时间单位。
workQueue 工作队列:当线程数大于等于核心线程数,且任务队列未满时,会先进入到此工作队列中,任务调度时再从队列中取出任务。
jdk中提供了四种工作队列queueCapacity
1.ArrayBlockingQueue基于数组的有界阻塞队列,按FIFO排序。
2.LinkedBlockingQuene基于链表的无界阻塞队列(其实最大容量为Integer.MAX),按照FIFO排序 3.SynchronousQuene一个不存储元素的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务,否则阻塞。
4.PriorityBlockingQueue具有优先级的无界阻塞队列。
threadFactory 线程工厂
handler 拒绝策略:当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,会执行拒绝策略。