java中的线程池Executor

线程池优点:

降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗

提高响应速度:当任务到达时,任务可以不需要等到线程穿件就能立即执行

提高线程的可管理性:线程时稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控

实现原理:

当向线程池提交一个任务后:

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实现,并且线程池中只有一个线程,只有一个,只有一个!

猜你喜欢

转载自blog.csdn.net/qq_42407917/article/details/111603316