|  | @ -3,51 +3,39 @@ package com.yihu.jw.care.config;
 | 
	
		
			
				|  |  | import org.apache.tomcat.util.threads.ThreadPoolExecutor;
 | 
	
		
			
				|  |  | import org.springframework.context.annotation.Bean;
 | 
	
		
			
				|  |  | import org.springframework.context.annotation.Configuration;
 | 
	
		
			
				|  |  | import org.springframework.scheduling.annotation.EnableAsync;
 | 
	
		
			
				|  |  | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | import java.util.concurrent.Executor;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * Created by chenweida on 2016.10.18.
 | 
	
		
			
				|  |  |  * 启用多綫程
 | 
	
		
			
				|  |  |  * Created with IntelliJ IDEA.
 | 
	
		
			
				|  |  |  *
 | 
	
		
			
				|  |  |  * @Author: yeshijie
 | 
	
		
			
				|  |  |  * @Date: 2021/4/30
 | 
	
		
			
				|  |  |  * @Description: 异步线程配置
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | @Configuration
 | 
	
		
			
				|  |  | @EnableAsync
 | 
	
		
			
				|  |  | public class AsyncConfig {
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private int corePoolSize = 5;
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 如果池中的线程数=maximumPoolSize,则有空闲线程使用空闲线程,否则新任务放入queueCapacity.
 | 
	
		
			
				|  |  |      * 设定 比 系统native thread个数要大的话,会优先抛出Java.lang.OutOfMemoryError: unable to create new native thread
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private int maxPoolSize = 10;
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 缓冲队列大小
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private int queueCapacity = 100;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 线程池维护线程所允许的空闲时间  秒
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     private int keepAliveSeconds = 300;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     @Bean
 | 
	
		
			
				|  |  |     public Executor taskExecutor() {
 | 
	
		
			
				|  |  |         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 | 
	
		
			
				|  |  |         executor.setCorePoolSize(corePoolSize);
 | 
	
		
			
				|  |  |         executor.setMaxPoolSize(maxPoolSize);
 | 
	
		
			
				|  |  |         executor.setQueueCapacity(queueCapacity);
 | 
	
		
			
				|  |  |         executor.setKeepAliveSeconds(keepAliveSeconds);
 | 
	
		
			
				|  |  |         /** Reject策略预定义有四种:
 | 
	
		
			
				|  |  |          (1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。
 | 
	
		
			
				|  |  |          (2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.
 | 
	
		
			
				|  |  |          (3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.
 | 
	
		
			
				|  |  |          (4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).
 | 
	
		
			
				|  |  |          */
 | 
	
		
			
				|  |  |         // 设置核心线程数
 | 
	
		
			
				|  |  |         executor.setCorePoolSize(5);
 | 
	
		
			
				|  |  |         // 设置最大线程数
 | 
	
		
			
				|  |  |         executor.setMaxPoolSize(20);
 | 
	
		
			
				|  |  |         // 设置队列容量
 | 
	
		
			
				|  |  |         executor.setQueueCapacity(200);
 | 
	
		
			
				|  |  |         // 设置线程活跃时间(秒)
 | 
	
		
			
				|  |  |         executor.setKeepAliveSeconds(60);
 | 
	
		
			
				|  |  |         // 设置默认线程名称
 | 
	
		
			
				|  |  |         executor.setThreadNamePrefix("user-device-");
 | 
	
		
			
				|  |  |         // 设置拒绝策略
 | 
	
		
			
				|  |  |         // rejection-policy:当pool已经达到max size的时候,如何处理新任务
 | 
	
		
			
				|  |  |         // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
 | 
	
		
			
				|  |  |         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
 | 
	
		
			
				|  |  | //        // 等待所有任务结束后再关闭线程池
 | 
	
		
			
				|  |  | //        executor.setWaitForTasksToCompleteOnShutdown(true);
 | 
	
		
			
				|  |  |         executor.initialize();
 | 
	
		
			
				|  |  |         return executor;
 | 
	
		
			
				|  |  |     }
 |