java.util.concurrent.ThreadPoolExecutor) 方法。底下提供了四种预界说的处理程序策略:
在默认的 ThreadPoolExecutor.AbortPolicy 中,处理程序碰钉子将抛出运行时 RejectedExecutionException。
在 ThreadPoolExecutor.CallerRunsPolicy 中,线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
在 ThreadPoolExecutor.DiscardPolicy 中,不克不及执行的任务将被删去。
在 ThreadPoolExecutor.DiscardOldestPolicy 中,要是执行程序尚未关闭,则位于工作行列步队头部的任务将被删去,然后重试执行程序(要是再次败绩,则反复此过程)。
界说和施用其他种类的 RejectedExecutionHandler 类也是可能的,但这样做需要非常小心,尤其是当策略仅用于特定容量或排队策略时。
1、简介
线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数目
maximumPoolSize:线程池维护线程的最大数目
keepAliveTime: 线程池维护线程所允许的空暇时间
unit: 线程池维护线程所允许的空暇时间的单位
workQueue: 线程池所施用的缓和冲突行列步队
handler: 线程池对拒绝任务的处理策略
1个任务通过 execute(Runnable)方法被新增到线程池,任务就是1个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
当1个任务通过execute(Runnable)方法欲新增到线程池时:
要是此时线程池中的数目小于corePoolSize,即使线程池中的线程都处于空暇状况,也要始于新的线程来处理被新增的任务。
要是此时线程池中的数目等于 corePoolSize,可是缓和冲突行列步队 workQueue未满,那么任务被放入缓和冲突行列步队。
要是此时线程池中的数目大于corePoolSize,缓和冲突行列步队workQueue满,而且线程池中的数目小于maximumPoolSize,建新的线程未处理被新增的任务。
要是此时线程池中的数目大于corePoolSize,缓和冲突行列步队workQueue满,而且线程池中的数目等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
也就是:处理任务的优先级为:
核心线程corePoolSize、任务行列步队workQueue、最大线程maximumPoolSize,要是三者都满了,施用handler处理被拒绝的任务。
当线程池中的线程数目大于 corePoolSize时,要是某线程空暇时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调解池中的线程数。
unit可选的参量为java.util.concurrent.TimeUnit中的几个静态属性:
NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue我常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()
抛出java.util.concurrent.RejectedExecutionException异样
ThreadPoolExecutor.CallerRunsPolicy()
重试新增时下的任务,他会自动反复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()
抛弃时下的任务