线程池的4种拒绝策略

1.ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等。常用构造方法

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

long keepAliveTime, TimeUnit unit,BlockingQueue workQueue,

RejectedExecutionHandler handler)

corePoolSize: 线程池维护线程的最少数量

maximumPoolSize:线程池维护线程的最大数量

keepAliveTime: 线程池维护线程所允许的空闲时间(解释:当线程池的数量超过corePoolSize时,多余的空闲线程的存活时间。)

unit: 线程池维护线程所允许的空闲时间的单位

workQueue: 线程池所使用的缓冲队列

handler: 线程池对拒绝任务的处理策略

handler有四个选择:

策略1:ThreadPoolExecutor.AbortPolicy()

抛出java.util.concurrent.RejectedExecutionException异常 ,示例如下:

小疑问:笔者对运行结果还是有一些疑问,为什么异常在下面第3行就出现了

策略2:ThreadPoolExecutor.CallerRunsPolicy

用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。如下:(小疑问:笔者对运行结果还是有很多的疑问,比如pool-1-thread-7 is running连续出现了好多次,这是为什么呢?)

解释:上面zxai

策略3:RejectedExecutionHandler handler =

new ThreadPoolExecutor.DiscardOldestPolicy();

这样运行结果就不会有100个线程全部被执行。处理源码如下:

Java中Queue的一些常用方法:

poll() 移除并返问队列头部的元素

解释:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。(问:为什么是弹出队列的头元素呢?答:是因为队列的先进先出原则,所以队列的头元素肯定是最老的一个请求,而DiscardOldestPolicy策略就是把最老的请求废除,把这个机会(相当于抢了最老的请求的吃到嘴边的肉)留给当前新提交到线程池里面的线程(这个时候线程池已经满了,队列也已经满了,如果不满的话,也不会有拒绝策略了!))

策略4:ThreadPoolExecutor.DiscardPolicy

用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

运行结果也不会全部执行100个线程。

源码如下,实际就是对线程不执行操作:

原文地址:https://blog.csdn.net/qq_40241957/article/details/85468994

原文地址:https://www.cnblogs.com/jpfss/p/11671127.html

时间: 2024-08-06 06:03:15

线程池的4种拒绝策略的相关文章

Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例

MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import android.os.Bundle; import android.app.Activity; /** * Demo描写叙述: * 线程池(Threa

Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用示例

MainActivity如下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 线程池(ThreadPoo

java线程池与五种常用线程池策略使用与解析

背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQueue详解 首先看一下新任务进入时线程池的执行策略: 如果运行的线程少于corePoolSize,则 Executor始终首选添加新的线程,而不进行排队.(如果当前运行的线程小于corePoolSize,则任务根本不会存入queue中,而是直接运行) 如果运行的线程大于等于 corePoolSize

java线程池和五种常用线程池的策略使用与解析

java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory th

ThreadPoolExecutor八种拒绝策略浅析

转自:http://www.kailing.pub/article/index/arcid/255.html 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用FixedThreadPool还是CachedThreadPool其背后实现都是ThreadPoolExecutor.ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有

Java线程池的几种实现 及 常见问题讲解

工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能.所以,“池”的用处就凸显出来了. 1. 为什么要使用线程池 在3.6.1节介绍的实现方式中,对每个客户都分配一个新的工作线程.当工作线程与客户通信结束,这个线程就被销毁.这种实现方式有以下不足之处: 服务器创建和销毁工作的开销( 包括所花费的时间和系统资源 )很大.这一项不用解释,可以去查下"线程

@EnableAsync @Asnc 以及4种拒绝策略

根据不同的场景,可以选择不同的拒绝策略,如果任务非常重要,线程池队列满了,可以交由调用者线程同步处理. 如果是一些不太重要日志,可以直接丢弃掉. 如果一些可以丢弃,但是又需要知道被丢弃了,可以使用ThreadPoolExecutor.AbortPolicy(),在异常处理中记录日志 /** * laizhenwei 2018-1-1 12:46:02 */ @Configuration @EnableAsync public class ExecutorConfig implements Asy

java所提供的线程池有几种之线程池总结

今天给大家带来一个关于java线程池的资料,主要是因为在早些时候去面试的时候就被问到了线程池的问题,回答的不尽人意,今天突然有人问我一个同样的问题,我觉的我还是总结一下,看起来也方便. Java提供的几种线程池线程池,顾名思义,放线程的池子嘛,这个池子可以存放多少线程取决于你自己采用什么样的线程池,你的硬件资源,以及并发线程的数量.JDK提供了下面的四种线程池: 固定线程数的线程池# 最简单的 在Java中创建一个线程池,这很简单,只需要两行代码. CopyExecutorService exe

Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

 在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是通过AsyncTask来实现,另一种方式则是通过ThreadPool来实现,今天我们就通过一个例子来讲解和对比这两种实现方式.     项目的结构如下所示:     在今天这个例子里,我们用到了之前一篇文章中写过的一个自定义控件,如果有同学感兴趣的话可以点击这里来先研究下这个控件的实现,为了配合异