java线程池使用小技巧-自定义拒绝策略(java线程池拒绝策略使用时机)

  本篇文章为你整理了java线程池使用小技巧:自定义拒绝策略(java线程池拒绝策略使用时机)的详细内容,包含有线程池自定义拒绝策略结合redis实现 java线程池拒绝策略使用时机 java自定义线程池应该咋设置 java 线程池拒绝策略 java线程池使用小技巧:自定义拒绝策略,希望能帮助你了解 java线程池使用小技巧:自定义拒绝策略。

  java 线程池默认提供了几种拒绝策略:

  这几个策略都实现了RejectedExecutionHandler,拿DiscardOldestPolicy来说,查看源码:

  核心代码只有2行:

  e.getQueue().poll() 从列表里弹出1个(最早的)任务,以便让队列空出1个位置

  e.execute(r) 新任务放入队列执行

  从这段代码来看,如果有任务被丢弃(即:从队列里弹出了),不会有任何报错,也没有日志可查,实际使用中不太方便监控这种情况。

  

  我们可以参考这段源码,自定义策略:

  

import java.util.concurrent.RejectedExecutionHandler;

 

  import java.util.concurrent.ThreadPoolExecutor;

  public class CustomDiscardPolicy implements RejectedExecutionHandler {

   //额外传入1个名称,方便打日志或埋点监控时,定位问题

   private String factoryName = "";

   public CustomDiscardPolicy(String factoryName) {

   this.factoryName = factoryName;

   public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {

   if (!e.isShutdown()) {

   Runnable poll = e.getQueue().poll();

   //这里可以加一些自己的处理(比如:埋点监控)

   System.err.println("[" + this.factoryName + "]task will be discard:" + poll);

   e.execute(r);

  

 

  当然,这里出于演示目的,只打了一行错误信息,实际应用中大家可以埋点发到kafka之类(以便后续做实时监控预警)。

  测试一下:

  

 @Test

 

   public void testThreadPool() throws InterruptedException {

   final ThreadFactory DEMO_THREAD_FACTORY = new ThreadFactoryBuilder().setNameFormat("demo-POOL-%d").build();

   final ExecutorService DEMO_POOL = new ThreadPoolExecutor(1, 2, 300L, TimeUnit.MILLISECONDS,

   new LinkedBlockingQueue (5), DEMO_THREAD_FACTORY, new CustomDiscardPolicy("demo-POOL"));

   for (int i = 0; i i++) {

   DEMO_POOL.submit(() - {

   try {

   System.out.println(Thread.currentThread().getId() + " ready!");

   //假设线程干活,需要一段时间

   Thread.sleep(500);

   System.out.println("\t" + Thread.currentThread().getId() + " done!");

   } catch (Exception e) {

   //等一会儿,让线程池都跑完,再结束main

   Thread.sleep(10000);

  

 

  提交了10个任务,线程池必然饱和(10 2+5),会丢弃一些早期任务,输出如下:

  从输出看,丢了3个任务,符合预期。

  
作者:菩提树下的杨过
 

  出处:http://yjmyzz.cnblogs.com

  本文版权归作者和共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  以上就是java线程池使用小技巧:自定义拒绝策略(java线程池拒绝策略使用时机)的详细内容,想要了解更多 java线程池使用小技巧:自定义拒绝策略的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: