
3.2 多执行绪
Spring 通过任务执行器(TaskExecutor)来实现多执行绪和并发程式设计。 使用 ThreadPoolTaskExecutor 可实现一个基于执行绪池的 TaskExecutor。而实际开发中任务一般是非阻碍的, 即异步的,所以我们要在配置类中通过 @EnableAsync 开启对异步任务的支援,并通过在实际执行的 Bean 的方法中 使用 @Async 注解来宣告其是一个异步任务。/**
* task
*/
@Slf4j
@Service
public class TaskService {
/**
* @Async 注解表明该方法是个异步方法
* 如果注解在类级别,则表明该类的所有方法都是异步方法
* 注意开启 @EnableAsync
* @Async 呼叫中的事务处理机制
* 在 @Async 标注的方法,同时也适用了@Transactional进行了标注;在其呼叫数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。
* 那该如何给这些操作新增事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被呼叫的方法上新增@Transactional.
* 例如: 方法A,使用了@Async/@Transactional来标注,但是无法产生事务控制的目的。
* 方法B,使用了@Async来标注,B中呼叫了C、D,C/D分别使用@Transactional做了标注,则可实现事务控制的目的。
*/
@Async
public void one() throws InterruptedException {
Thread.sleep(1000);
log.info("-> one");
}
@Async
public void two() throws InterruptedException {
Thread.sleep(3000);
log.info("-> two");
}
@Async
public void three() throws InterruptedException {
Thread.sleep(2000);
log.info("-> three");
}
}
/**
* 配置类
*/
@Configuration
@ComponentScan("chapter3.task")
@EnableAsync
public class TaskConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(5);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setQueueCapacity(25);
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
/**
* 执行类
*/
public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskConfig.class);
TaskService taskService = context.getBean(TaskService.class);
for (int i=0; i taskService.one();
taskService.two();
taskService.three();
}
context.close();
// 结果是不是按照顺序执行,也就证明任务是异步执行。
// -> one
// -> one
// -> three
// -> one
// -> two
// -> three
// -> two
// -> three
// -> two
}
}





























