ThreadPoolTaskExecutor
常用的异步线程池配置,在使用对应配置是在方法上加@Async("threadPool")注解,字符串为@Bean下对应方法名(看下放配置代码),注意在调用异步方法时新开一个class,在同一类中调用不起作用。
ForkJoinPool
我常用于串行流线程池配置
示例代码
/** * 线程池全局配置类 */ @Configuration @EnableAsync public class ExecutorConfig { /** * 线程池的配置 * * @Author 盛春强 * @Date 2021/4/21 16:12 * @Param [] * @Return java.util.concurrent.Executor */ @Bean public Executor threadPoolExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(5); //配置最大线程数 executor.setMaxPoolSize(10); //配置队列大小 executor.setQueueCapacity(100); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix("threadPool-"); // rejection-policy:当pool已经达到max size的时候,并且队列已经满了,如何处理新任务 // DiscardPolicy: 直接丢弃 // CallerRunsPolicy:不在新线程中执行任务,而是有调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //执行初始化 executor.initialize(); // 等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); return executor; } /** * 配置stream并行流线程池 * * @Author 盛春强 * @Date 2021/4/21 15:17 * @Param [] * @Return void */ @Bean public String parallelStreamConfig() { return System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "10"); } }
/* parallelStream并行流单独配置 */ // 配置十个线程 ForkJoinPool forkJoinPool = new ForkJoinPool(10); forkJoinPool.submit(() -> { Collections.EMPTY_LIST.parallelStream().forEach(item -> { try { Thread.sleep(5); System.out.println("完成"); } catch (InterruptedException e) { log.error(e.toString()); Thread.currentThread().interrupt(); } }); });