这是7个参数的JDK源码:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
大家可能看了还是有点懵,我来说一个生活中的例子吧~
比如大家去银行办理业务,银行有办理业务的窗口(有限个),还有提供的座位(让来办理业务的客户等待休息的位置有限个),它的这个办理业务的窗口并不是什么时候都全部开放的,还有的情况就是办理业务的窗口和让客户休息的位置全满了的情况,就会触发最后一个参数的拒绝策略。
来看这段测试代码,加深理解:
import java.util.concurrent.*;
public class Test1 {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(
2, //核心线程池的大小
5, //最大核心线程池的大小
3, //超时时间(释放)
TimeUnit.SECONDS,//超时时间的单位
new LinkedBlockingDeque<>(3),//阻塞队列
Executors.defaultThreadFactory(),//创建线程的工厂
// new ThreadPoolExecutor.AbortPolicy() //拒绝策略 满了不接待 //java.util.concurrent.RejectedExecutionException:抛出异常
// new ThreadPoolExecutor.CallerRunsPolicy()// main ok 让ta回去 哪来的去哪 不会抛出异常
// new ThreadPoolExecutor.DiscardPolicy() //队列满了 不抛出异常 但是ta会把任务丢掉
new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了 ta会尝试和最早的竞争 (仅仅是尝试)也没有异常
);
try {
for (int i = 0; i < 100; i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" ok ");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}
}
关于拒绝策略的深入,大家可以研究下源码:
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。