Java线程池

xiaoxiao2021-02-27  148

Java线程池

五种简单线程池创建方式

简单线程池由Executors类提供

固定大小线程池newFixedThreadPool()可变大小线程池newCachedThreadPool()单一线程池newSingleThreadExecutor()单一定时任务线程池newSingleThreadScheduledExecutor()定时任务线程池newScheduleThreadPool()

定时任务线程池深入

定时任务线程池是由ScheduledExecutorService 在ExecutorService之上扩展了定时执行任务功能得到。ScheduleExecutorService提供如下方法

public ScheduleFuture<?> schedule(Runnable command, long delay,TimeUnit unit) public ScheduleFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) public ScheduleFuture<?> scheduleAtFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit)

schedule会在给定时间对任务进行一次调度。 scheduleAtFixedRate和scheduleAtFixedDelay会周期性调用。二者区别在于通常情况下scheduleAtFixedRate不关心任务执行时间,会严格按照给定周期进行调度;而scheduleAtFixedDelay则在每次任务执行完成之后才开始计算下一次调度周期。 特别的,当scheduleAtFixedRate任务时间超过调度周期,ScheduleExecutorService并不会让任务堆叠运行,而是等待任务执行完成之后立即调度下一次任务。 另外,当定时任务抛出异常而未被捕获处理时,该任务将永久性停止。

核心线程池深入

除定时任务线程池外,其余三种核心线程池均是ThreadPoolExecutor的封装。

public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ) corePoolSize:常态线程数量 maximumPoolSize:最大线程数量 keepAliveTime:当线程池数量超过corePoolSize时,多余的空闲线程存活时间 unit:keepAliveTime的时间单位 workQueue:被添加的任务(未被执行的) threadFactory:线程工厂 handler:拒绝策略

关于workqueue

workQueue定义了存放待执行任务的队列,由BlockingQueue接口提供,其实现类主要有如下四种:

直接提交队列SynchronousQueue SynchronousQueue并不会保存实际任务,当有新任务提交时总是尝试提交给线程池执行。若无空闲进程则尝试创建新进程,若已达最大线程则执行拒绝策略。有界任务队列ArrayBlockingQueue 定义有界任务队列时需传入最大容量参数。当有新任务提交时,若线程数小于corePoolSize则优先创建线程执行,若大于corePoolSize则任务入列等待执行,若队列已满,则在maximumPoolSize之内创建线程,若超出则执行拒绝策略。无界任务队列LinkedBlockingQueue 相对于有界任务队列,无界任务队列没有容量限制,当线程数大于corePoolSize时,任务入列。优先任务队列PriorityBlockingQueue 特殊的无界队列,相较于有界、无界队列的先入先出策略,可设定任务优先级。

关于拒绝策略

异常策略AbortPolicy 直接抛出异常调用策略CallerRunsPolicy 直接在当前线程中执行任务丢弃最老策略DiscardOledestPolicy 丢弃最老的一个请求(即非优先队列下即将被执行的任务)丢弃策略DiscardPolidy 直接丢弃
转载请注明原文地址: https://www.6miu.com/read-15712.html

最新回复(0)