加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

自定义RejectedExecutionHandler的实现

(2018-03-12 21:08:55)
标签:

rejectedexecutionhan

threadpoolexecutor

多线程

分类: 原创

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中也提供了几种可选的拒绝策略实现类,比如 AbortPolicyDiscardPolicyDiscardOldestPolicyCallerRunsPolicy等,其中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.   

 

 

0

阅读 收藏 喜欢 打印举报/Report
前一篇:多肉怎么施肥
后一篇:多肉开花吗
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有