在使用线程池的过程中,有时候会碰到缓存队列已满的尴尬情况,这个时候我们就需要拒绝掉它们,不能继续执行任务了,那该怎么拒绝呢?一起来看看吧。
当线程池任务缓存队列已满且线程池中线程数达到maximumPoolSize时,如果还有任务到来的话就会使用任务拒绝策略。
线程池一共有四种拒绝策略:
1.ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 2.ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
3.ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 4.ThreadPoolExecutor.CallerRunsPolicy:调用提交任务的线程处理该任务
下面来看几个例子了解一下它们吧。
AbortPolicy:线程池固定默认拒绝策略,会丢弃任务并抛出RejectedExecutionException异常。
结果:AbortPolicy 直接抛出异常。
CallerRunsPolicy:当超过最大线程池数量的时候,调用CallerRunsPolicy会先把阻塞队列里面尾部任务停止
DiscardOldestPolicy:当启动DiscardOldestPolicy拒绝策略时,阻塞队列满的时候会直接去掉队尾元素,并将当前任务插入队尾
DiscardPolicy:执行DiscardPolicy时只会执行当前线程池和阻塞队列里面的任务,其他的都会被丢弃
以上就是本篇文章的所有内容了,想知道更多关于Java一些知识问答的小知识的话,请持续关注本站。