private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
private ExecutorService taskExe = new ThreadPoolExecutor(10,20,200L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory);
1.corePoolSize:核心线程数量
2.maximumPoolSize:线程不够用时能够创建的最大线程数
3.workQueue:任务等待队列
4.keepAliveTime:抢占的顺序不一定,看运气
5.threadFactory:创建新线程,Executor.defaultThreadFactory()
首先线程池它有一个核心线程数,当线程运行的时候,如果没有设置成预启动加载,线程数是0;
当提交一个新任务的时候,它会建立一个核心线程去执行任务,此时如果一直来任务,之前的也没有执行完,它会一直创建核心线程;
当达到核心线程数时,如果还都在忙,那么就会放到blockingQueue阻塞队列;
如果阻塞队列也放满了,而且核心线程还在忙,那就会去建立非核心线程,如果一直创建,数量达到非核心最大的线程数,就会触发一个拒绝策略
JDK内置了四种拒绝策略:
AbortPolicy直接抛异常
DiscarePolicy悄无声息的丢弃任务
DiscardOldestPolicy丢弃你最早未执行的任务
CallerRunsPolicy谁调用返回谁执行,这种方式会影响新任务的提交速度