1.corePoolSize:在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中
2.maximumPoolSize:当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize
3.keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止
4.unit:keepAliveTime的时间单位
5.workQueue:一个阻塞队列,用来存储等待执行的任务,(ArrayBlockingQueue; LinkedBlockingQueue; SynchronousQueue;)
6.threadFactory:线程工厂
7.handler:拒绝处理任务时的策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
// executor.shutdown();
当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出
ExecutorService executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(blockingQueueSize),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
executor.execute(() -> {
// todo
});
executor.shutdown();
try {
if(!executor.awaitTermination(2, TimeUnit.HOURS)){
logger.info("线程池2小时内未执行完,强制关闭!");
executor.shutdownNow();
}
} catch (InterruptedException e) {
logger.error(e.getMessage(), e);
}