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); }