基于springboot&@EnableAsync线程池使用

基于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;//模拟异常
    }

 

控制台打印

正常情况

异常捕获:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值