线程池优点:
降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗
提高响应速度:当任务到达时,任务可以不需要等到线程穿件就能立即执行
提高线程的可管理性:线程时稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控
实现原理:
当向线程池提交一个任务后:
1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程
2)线程池判断工作队列是否已经存满。如果没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程
3)线程池判断线程池的线程(最大线程数量)是否都处于工作状态。如果没有则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略处理
参数说明:
corePoolSize:线程池的大小。当提交一个任务到线程池时才会创建线程,即使其他线程空闲也会创建,当需要执行的任务大于该值时则停止新建操作。
maximumPoolSize:线程池中允许创建的最大线程数;
runnableTaskQueue:任务队列,用来存储等待执行的任务,分别为:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue(尽可能使用有界队列,无界队列会存在内存溢出风险)
threadFactory:线程工厂,是用来设置创建线程的工厂。实现ThreadFactory接口即可
rejectedExecutionHandler:饱和策略。当线程池和队列都满了,新任务采取饱和策略,有以下取值:
AbortPolicy:抛出异常。
DiscardPolicy:丢弃任务,但是不抛出异常。
DiscardOldestPolicy:丢弃队列最前面的任务,并执行当前任务
CallerRunsPolicy:由调用线程处理该任务
keepAliveTime:空闲线程存活时间。默认情况下,该值在线程数大于corePoolSize时,对超出corePoolSize值得这些线程起作用。
TimeUnit:空闲线程存活时间的单位,可选单位有天(DAYS)、小时(HOURS)、分钟(MINUTES)、秒(SECONDS)
提交任务:
向线程池提交任务调用execute()或submit()方法即可
execute():没有返回值,入参必须是一个实现Runnable接口的实例
submit():有返回值,返回一个future类型的对象调用get()方法获取返回值,入参必须是一个实现Callable接口的实例
ScheduledThreadPoolExecutor:
ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务,使用无界队列(DelayQueue),所以设置maximumPoolSize的大小没什么效果,当调用scheduleAtFixedRate()和scheduleWithFixedDelay()方法
时向队列中添加任务,线程池中的线程从队列中获取任务,然后执行
Spring中的定时任务使用ScheduledThreadPoolExecutor实现,并且线程池中只有一个线程,只有一个,只有一个!