基于springboot,使用@EnableAsync注解方式开启多线程
线程池配置类
@Configuration
@EnableAsync//开启多线程
public class AsyncTaskConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(Runtime.getRuntime().availableProcessors());//核心线程数
taskExecutor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*2);//最大线程数
taskExecutor.setQueueCapacity(Int.MaxValue());//队列大小
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(60);
taskExecutor.setThreadNamePrefix("transfer-server-%d");//线程名前缀
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略
taskExecutor.initialize();
return taskExecutor;
}
//异常获取机制
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
//自定义异常处理类,实现AsyncUncaughtExceptionHandler
return new MyAsyncUncaughtExceptionHandler();
}
}
Runtime.getRuntime().availableProcessors() 获取可用处理器个数
拒绝策略
ThreadPoolExecutor.AbortPolicy 丢弃任务抛RejectedExecutionException异常(这是线程池默认的拒绝策略,在任务不能提交的时候,抛出异常及时反馈程序运行状态。)
ThreadPoolExecutor.DiscardPolicy 丢弃任务,但不抛异常。如果是线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
ThreadPoolExecutor.DiscardOldestPolicy 丢弃队列最前边的任务,然后重新提交被拒绝的任务
ThreadPoolExecutor.CallerRunsPolicy 由调用线程处理该任务(如果任务被拒绝了,则由调用线程(提交任务的线程)直接执行此任务)
/**
* 自定义异常处理类
*/
public class MyAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
@Autowired
private ITransferDataService transferDataService;
//手动处理捕获异常
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
System.out.println("异常信息名称"+throwable.getMessage());
//获取数据
if (objects.length>0){
List list =(List) objects[0];
//进行失败重试,数据重新转发
System.out.println("失败条数:"+list.size()+"------"+list);
//transferDataService.transfer(list);
}
}
}
}
开始多线程执行操作
@Component
@EnableScheduling // 开启定时任务
public class IotScheduleTask {
@Autowired
private ITransferDataService transferDataService;
/**
* 接收发送控制定时器
*/
@Scheduled(fixedDelay = 1000)
public void receiveSendControl(){
// List<String> list = KafkaTools.receiveTransferData();
//模拟kafka数据
LinkedList<String> list = new LinkedList<>();
String date="{\"name\":\"CA604023392B31\",\"time\":\"2020-05-12 15:32:42\",\"data\":\"24.72,29.57,21.72,40.33,21.72,21.62,20.40,26.62,23.27,19.81,22.01,41.72,21.15,43.61,19.73,43.13,24.29,18.22,22.28,36.77,21.48,43.48,20.78,41.61,23.11,34.06,20.83,42.59,19.12,27.36,20.08,35.49,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00\"}";
String date1="005,D16794432C2334,2014-2-10 10:57,17.7,4.9,25.6,23.5,23.7,25.6,29.5,27.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.30,-3.28,1.0,1.0,13.4,0,494C,8F7D";
list.add(date);
list.add(date1);
list.add(date1);
list.add(date);
if(list != null && list.size() > 0){
transferDataService.transfer(list);
}
}
}
public class TransferDataServiceImpl implements ITransferDataService {
@Async//表示该方法开启多线程执行
@Override
public void transfer(List<String> list) {
System.out.println("异步执行"+Thread.currentThread().getName());
int i=1/0;//模拟异常
}
控制台打印
正常情况
异常捕获: