异步任务处理注解⽅法@Async实现异步多线程
异步任务处理注解⽅法@Async实现异步多线程
1.定义配置类,设置参数
2.定义任务执⾏类
3.执⾏
Spring 中的ThreadPoolExecutor是借助JDK并发包中的urrent.ThreadPoolExecutor来实现的。其中⼀些值的含义如下:
int corePoolSize:线程池维护线程的最⼩数量
int maximumPoolSize:线程池维护线程的最⼤数量,线程池中允许的最⼤线程数,线程池中的当前线程数⽬不会超过该值。如果队列中任务已满,并且当前线程个数⼩于maximumPoolSize,那么会创建新的线程来执⾏任务。
long keepAliveTime:空闲线程的存活时间TimeUnit unit:时间单位,现由纳秒,微秒,毫秒,秒
BlockingQueue workQueue:持有等待执⾏的任务队列
RejectedExecutionHandler handler 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,⽽采取的处理措施。
当任务添加到线程池中之所以被拒绝,可能是由于:第⼀,线程池异常关闭。第⼆,任务数量超过线程池的最⼤限制。
Reject策略预定义有四种:
(1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运⾏时 RejectedExecutionException。
(2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调⽤者的线程会执⾏该任务,如果执⾏器已关闭,则丢弃.
(3)ThreadPoolExecutor.DiscardPolicy策略,不能执⾏的任务将被丢弃.
(4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执⾏程序尚未关闭,则位于⼯作队列头部的任务将被删除,然后重试执⾏程序(如果再次失败,则重复此过程).
1.定义配置类,设置参数
st.config;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import t.annotation.ComponentScan;
import t.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.urrent.ThreadPoolTaskExecutor;
import urrent.Executor;
@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(50);springboot实现aop
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
2.定义任务执⾏类
st.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
/**
*
*/
@Repository("asyncTaskService")
public class AsyncTaskService {
@Async
public void executeAsyncTask1(Integer i){
System.out.println(Thread.currentThread().getId() + "-" + Thread.currentThread().getName()+"执⾏异步任务1:"+i);
}
@Async
public void executeAsyncTask2(Integer i){
System.out.println(Thread.currentThread().getId() + "-" + Thread.currentThread().getName()+"执⾏异步任务2:"+i);    }
}
3.执⾏
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
AsyncTaskService asyncTaskService;
@Test
public void contextLoads() {
System.out.println("hello");
for(int i=0;i<10;i++){
}
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。