SpringBoot自定义线程池异步执行任务
SpringBoot自定义线程池异步执行任务
@EnableAsync //开启异步
@Configuration
public class MyAsyncConfigurer implements AsyncConfigurer {
/** 线程池拒绝策略
* 1. AbortPolicy
* 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
* (该策略下,直接丢弃任务,并抛出RejectedExecutionException异常)
* 2. CallerRunsPolicy
* 不进入线程池执行,在这种方式(CallerRunsPolicy)中,任务将由调用者线程去执行。
* (用于被拒绝任务的处理程序,它直接在execute 法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务.)
* 3. DiscardPolicy
* 当任务添加到线程池中被拒绝时,默认情况下它将丢弃被拒绝的任务。
* (即该策略下,直接丢弃任务,什么都不做)
* 4. DiscardOldestPolicy
* 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
* (该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列)
* @return
*/
//自定义线程池
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程
executor.setCorePoolSize(10);
//最大线程
executor.setMaxPoolSize(20);
//队列大小
executor.setQueueCapacity(Integer.MAX_VALUE);
//线程活跃时间,默认60秒
//executor.setKeepAliveSeconds();
//设置线程之间的threadlocal相互传递的方式,自定义一个类去实现TaskDecorator接口
//executor.setTaskDecorator(MyTaskDecorator);
//所有任务结束后关闭线程池
//executor.setWaitForTasksToCompleteOnShutdown(true);
//设置拒绝策略rejectedExecutionHandler
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//设置线程名称前缀
executor.setThreadNamePrefix("myTaskExecutor-");
executor.initialize();
return executor;
}
/**
* 自定义线程全局异常处理
* @return
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncExceptionHandler();
}
}
@Slf4j
public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
log.info("------全局线程池异常处理-----");
log.info("------error fillInStackTrace:" + throwable.fillInStackTrace());
log.info("------error message:" + throwable.getMessage());
log.info("------error methodName:" + method.getName());
for (Object param : objects)
{
log.info("------param:" + param);
}
}
}
//静态异步任务
// @Scheduled默认时单线程
@Component
public class MyTask {
@Scheduled(cron = "0/5 * * * * ?")
@Async //异步任务
public void task1() {
System.out.println("------静态定时任务1" + Thread.currentThread().getId() + "------" +
Thread.currentThread().getName() + "调度:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
@Scheduled(cron = "0/10 * * * * ?")
@Async
public void task2() {
System.out.println("------静态定时任务2" + Thread.currentThread().getId() + "------" +
Thread.currentThread().getName() + "调度:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
下一篇:
Java | ArrayList用法总结
