一、线程池的状态
线程池有5中状态
1、Running:接收新任务,处理已添加的任务
2、shutdown:不接收新任务,处理已添加的任务
3、stop:不接收不处理,且会中断当前任务
4、tidying:当线程池状态为shutdown或者stop,并且任务清零后就会变成此状态
5、terminated:执行完毕
二、线程池原理
提交一个任务,若当前线程数小于核心线程数,则新建一个核心线程运行该任务,当核心线程数满了之后,新提交的任务放入任务队列中排队等待执行,当核心线程数满了+任务队列满了之后,判断当前线程数是否达到最大线程数,若未达到最大线程数,则创建非核心线程数,若当前线程数达到最大线程数之后,则采用拒绝策略。
三、拒绝策略
// 自定义线程池拒绝策略
// new ThreadPoolExecutor.AbortPolicy() 丢弃并抛异常 默认拒绝策略
//new ThreadPoolExecutor.CallerRunsPolicy() 当触发拒绝策略,如果被丢弃的线程未关闭,执行该线程
//new ThreadPoolExecutor.DiscardPolicy() 直接放弃新任务
//new ThreadPoolExecutor.DiscardOldestPolicy() 丢弃队列中最老的任务,将新任务加入
四、4中常用线程池
// 可缓存线程池,当执行当前任务时,若上一个任务已经完成,会直接使用上一个任务的线程,不会每次都新建线程
private static ExecutorService threadPool1 = Executors.newCachedThreadPool();
// 固定长度线程池,最大线程数与核心线程数相同等于传入的固定线程数,每创建一个线程,线程池就+1,直到等于最大线程数后,开始重复使用
private static ExecutorService threadPool2 = Executors.newFixedThreadPool(2);
// 单线程池,创建一个线程之后复用
private static ExecutorService threadPool3 = Executors.newSingleThreadExecutor();
//定时线程池,按照给定的频率,给定的延时执行
private static ScheduledExecutorService threadPool4 = Executors.newScheduledThreadPool(5);
五、自定义线程池
//最终创建线程池的方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
可缓存线程池使用new SynchronousQueue<Runnable>(),适合并发执行大量短任务
固定长度线程池与单线程池均使用new LinkedBlockingQueue<Runnable>(),适合执行长任务
定时执行线程池使用new DelayedWorkQueue(),适合执行定时任务
六、如果线程池的一个线程运行时异常,会发生什么
如果提交任务时submit,则返回的对象有异常信息,如果提交任务时execute,则直接打印异常信息,但是不会影响其他线程,之后线程池会删除该线程,会新增一个线程。