1.RejectedExecutionHandler的作用
在使用jdk提供的线程池时,我们通常使用下面的构造方法进行线程池的创建:
Java代码
1.
public ThreadPoolExecutor(int corePoolSize,
2.
int maximumPoolSize,
3.
long keepAliveTime,
4.
TimeUnit unit,
5.
BlockingQueue workQueue,
6.
RejectedExecutionHandler handler) {
7.
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
8.
Executors.defaultThreadFactory(), handler);
9.
}
其中RejectedExecutionHandler用于当线程池和缓冲队列满了之后定义的拒绝策略,当然jdk中也提供了几种可选的拒绝策略实现类,比如 AbortPolicy、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicy等,其中AbortPolicy是线程池默认的拒绝策略。
但是jdk提供的这几个拒绝策略实现类都不是业务友好型的,当触发丢弃或拒绝策略时通常都是抛出一个runtime
excepion或者没有任何反馈,默默就丢弃了。。
如果需要将线程的上下文信息带进来,或者自定异常日志文件输出格式,就需要我们自己定义一个RejectedExecutionHandler的实现类来处理了。
下面介绍一下自定义RejectedExecutionHandler的两种用法:
2.自定义RejectedExecutionHandler的实现
RejectedExecutionHandler是一个接口类,我们在使用的时候只需要通过新建一个class,然后实现其中的rejectedExecution方法即可。
我们分别介绍两种用法,一种是最常见的获取线程信息;另外一种是获取线程的上下文信息。
2.1
获取线程信息
有时候我们在处理丢弃线程的时候,需要将线程自身相关的线程id,线程名称等信息输出,这时候通过实现方法中的Runnable变量进行查询获取。示例代码如下:
Java代码
1.
public class RejectedExecutionHandlerTest implements RejectedExecutionHandler {
2.
private static final Logger logger = LoggerFactory.getLogger("test");
3.
@Override
4.
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
5.
logger.info("RejectedExecutionHandlerTest thread={}",r.toString());
6.
}
7.
}
2.2
获取线程的上下文业务信息
上一小节中提到的Runnable属性只能查询到线程自身的属性信息,但是业务逻辑中的上下文信息就获取不到了,那么如何才能获取到线程的上上文业务信息呢:自定义线程。
2.2.1自定义线程类
首先我们需要自定义线程,通过实现Runnable接口实现,示例代码如下:
Java代码
1.
public class TestRunnable implements Runnable {
2.
private String bizMessage;
3.
public TestRunnable(String bizMessage){
4.
this.bizMessage = bizMessage;
5.
}
6.
@Override
7.
public void run() {
8.
//TODO
9.
}
10.
public String getBizMessage() {
11.
return bizMessage;
12.
}
13.
public void setBizMessage(String bizMessage) {
14.
this.bizMessage = bizMessage;
15.
}
16.
}
2.2.2
自定义RejectedExecutionHandler
这样我们就可以在自定义的RejectedExecutionHandler类中实现从TestRunnable中获取到业务线程的上下文信息bizMessage属性了。
自定义RejectedExecutionHandler类的示例代码入下:
Java代码
1.
public class OrderEventThreadRejected implements RejectedExecutionHandler {
2.
@Override
3.
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
4.
if (r instanceof TestThreadRunnable) {
5.
TestThreadRunnable runnable = (TestThreadRunnable)r;
6.
runnable.getBizMessage();
7.
}
8.
}
9.
}
加载中,请稍候......