总所周知,java里面线程池的四个拒绝策略
AbortPolicy 丢弃并抛出RejectedExecutionException异常
DiscardPolicy 直接丢弃
DiscardOldestPolicy 直接丢弃最前面的任务,尝试执行新任务
CallerRunsPolicy 由调用线程池的线程处理任务,可以是主线程,也可能是其他创建线程池的线程。
其中最难理解的是CallerRunsPolicy。网上资料杂乱,难以理解还误导人。
其实在大佬写的书《Java并发编程的艺术》里面说过是只用调用者所在线程来运行任务。
说到这里一般认为就是交给主线程处理任务,其实不是,因为在线程里面也可以创建线程池,具体看下面的代码实例。所以处理任务的不一定是主线程,有可能还是子线程。到这里就明白了CallerRunsPolicy策略是将任务交给调用线程池的线程。
public class HanderPolicy {
public static void main(String[] args) {
//创建线程池,并获得线程池管理对象
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 60,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), new ThreadPoolExecutor.CallerRunsPolicy());
//使用Runnable的lambda表达式实现任务提交
threadPoolExecutor.submit(()-> {
System.out.println(Thread.currentThread().getName()+"执行了");
//线程内部的线程池
ThreadPoolExecutor threadPoolExecutor1 = new ThreadPoolExecutor(2, 2, 60,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), new ThreadPoolExecutor.DiscardOldestPolicy());
for (int i=1;i<=20;i++) {
int j=i;
threadPoolExecutor1.submit((()->
{
。。。。。。。。。
读到这里,希望对大家有用。