JDK文档(汉化版)解释:
![](https://i-blog.csdnimg.cn/blog_migrate/50f791a7b6e7dc642246da8994d616d1.png)
下面通过例子说明:
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文档才会说:“这提供了一个简单的反馈控制机制,将降低新任务提交的速度”。
![](https://i-blog.csdnimg.cn/blog_migrate/649787096741c4888fed6a9e56ca2cfe.png)