您的位置:首页 > 编程语言 > Java开发

Spring4.x高级话题(二):多线程

2017-10-26 15:03 453 查看
转自:http://blog.longjiazuo.com/archives/1338


一. 点睛

Spring
通过任务执行器(
TaskExecutor
)来实现多线程和并发编程。使用
ThreadPoolTaskExecutor
可实现一个基于线程池的
TaskExecutor
。而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过
@EnableAsync
开启对异步任务的支持,并通过在实际执行的
Bean
的方法中使用
@Async
注解来声明其是一个异步任务。


二. 示例


1. 配置类

package org.light4j.sping4.senior.taskExecutor;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@ComponentScan("org.light4j.sping4.senior.taskExecutor")
@EnableAsync //①
public class TaskExecutorConfig implements AsyncConfigurer{//②

@Override
public Executor getAsyncExecutor() {//②
ThreadPoolTaskExecutortaskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
return taskExecutor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}

}


代码解释:

① 利用
@EnableAsync
注解开启异步任务支持。

② 配置类实现
AsyncConfigurer
接口并重写
getAsyncExecutor
方法,并返回
ThreadPoolTaskExecutor
,这样就获得了一个基于线程池的
TaskExecutor



2. 任务执行类

package org.light4j.sping4.senior.taskExecutor;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncTaskService {

@Async //①
public void executeAsyncTask(Integer i){
System.out.println("执行异步任务: "+i);
}

@Async
public void executeAsyncTaskPlus(Integer i){
System.out.println("执行异步任务+1: "+(i+1));
}
}


代码解释:

① 通过
@Async
注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用
ThreadPoolTaskExecutor
作为
TaskExecutor



3. 运行

package org.light4j.sping4.senior.taskExecutor;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);

AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

for(int i =0 ;i<10;i++){
asyncTaskService.executeAsyncTask(i);
asyncTaskService.executeAsyncTaskPlus(i);
}
context.close();
}
}


输出结果表明是并发执行而不是顺序执行的,

运行结果如下图所示:




4. 源代码示例:

github
地址:点击查看

码云地址:点击查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: