大多数人不知道的:线程池CallerRunsPolicy()拒绝策略

Posted Java知音_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大多数人不知道的:线程池CallerRunsPolicy()拒绝策略相关的知识,希望对你有一定的参考价值。

点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/dabusiGin/article/details/105323796

在学习CallerRunsPolicy拒绝策略的时候,搜索了很多相关的知识,其他博主的描述是这样的:

第1种:

第2种:

第3种:

第4种:JDK文档(汉化版)

他们的描述让我看的很懵逼,特别是第3种,仔细看他的测试代码,并没有用CallerRunsPolicy,而是用的AbortPolicy拒绝策略。。。。这是一篇高浏览量的博文,而且多人转载。

其中上面几种情况中写到的“execute方法的调用线程”、“调用者线程”、“execute函数的上层线程”、“execute本身的线程”就是指的主线程,举个例子如下图所示,主线程就是平时执行main方法中代码的线程。

再通过一个例子详细说明:

class MyTask implements Runnable {
 private String id;

 public MyTask(String id) {
  this.id = id;
 }

 public void run() {
  System.out.println(id);
 }
}

public class RejectPolicy {
 public static void main(String[] args) {
  ExecutorService es = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS,
    new ArrayBlockingQueue<Runnable>(3), Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.CallerRunsPolicy());
  MyTask t1 = new MyTask("id:1");
  MyTask t2 = new MyTask("id:2");
  MyTask t3 = new MyTask("id:3");
  MyTask t4 = new MyTask("id:4");
  MyTask t5 = new MyTask("id:5");
  MyTask t6 = new MyTask("id:6");
  MyTask t7 = new MyTask("id:7");

  es.execute(t1);
  es.execute(t2);
  es.execute(t3);
  es.execute(t4);
  es.execute(t5);
  es.execute(t6);
  es.execute(t7);
 }
}

这里使用主要参数是:核心线程数为2、最大线程数为2、有界队列(容量为3)、默认线程工厂、CallerRunsPolicy拒绝策略。

运行结果如下:

id:1
id:2
id:3
id:4
id:6
id:5
id:7

可以看到所有的任务都执行了,没有真正意义上被拒绝的。

学习资料:Java进阶视频资源

代码中定义了核心线程数为2的线程池,一共有7个任务要执行,其中2个任务创建线程执行去了,3个任务放入了任务队列(workQueue)。

当提交到第6个任务的时候,会触发拒绝策略,在这里我们配置了CallerRunsPolicy策略,主线程直接执行第六个任务去了,不再向下执行main方法中的es.execute(t7)这段代码。

也就是说,在本程序中最多会有3个任务在执行,3个在等待。由此限制了线程池的等待任务数与执行线程数。所以JDK文档才会说:“这提供了一个简单的反馈控制机制,将降低新任务提交的速度”。

我的一点个人理解,希望能有助理解。

推荐:

主流Java进阶技术(学习资料分享)

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

以上是关于大多数人不知道的:线程池CallerRunsPolicy()拒绝策略的主要内容,如果未能解决你的问题,请参考以下文章

10个很多人不知道的Redis使用技巧

由于不知线程池的bug,某Java程序员叕被祭天

90%人不知道的大厂面试流程和技巧

很多人不知道的Python 炫技操作:条件语句的七种写法

90%人不知道的Python炫技操作:合并字典的七种方法

80% 人不知道的 Redis 分布式锁的正确实现方式(Java 版)