线程池CallerRunsPolicy()拒绝策略

该示例展示了Java的ThreadPoolExecutor如何工作,当线程池达到最大容量时,CallerRunsPolicy策略如何生效。核心线程数为2,最大线程数也是2,有界队列容量为3。在提交第6个任务时,由于队列已满,根据CallerRunsPolicy,任务由主线程执行,导致第7个任务未被提交。此策略用于控制新任务的提交速度。
摘要由CSDN通过智能技术生成

JDK文档(汉化版)解释:

下面通过例子说明:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值