一、线程池的状态

线程池有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,则直接打印异常信息,但是不会影响其他线程,之后线程池会删除该线程,会新增一个线程。

03-28 04:18