1、异步测试类
package com.async2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@EnableAsync
@ComponentScan
public class BeanConfig {
public static final String ADD_EXECUTOR = "addExecutor";
public static final String REDUCE_EXECUTOR = "reduceExecutor";
@Primary
@Bean(ADD_EXECUTOR)
public Executor addExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
//线程名称前缀
executor.setThreadNamePrefix("add-thread-");
return executor;
}
@Bean(REDUCE_EXECUTOR)
public Executor reduceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
//线程名称前缀
executor.setThreadNamePrefix("reduce-thread-");
return executor;
}
}
2、业务类
package com.async2;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
@Component
public class AccountService {
@Resource(name = BeanConfig.ADD_EXECUTOR)
private ThreadPoolTaskExecutor addExecutor;
@Async(BeanConfig.ADD_EXECUTOR)
public void add() {
System.out.println(Thread.currentThread() + "账户充值");
}
@Async
public void add2() {
addExecutor.execute(new Runnable() {
@Override
public void run() {
//业务方法或其他业务方法的调用
System.out.println(Thread.currentThread() + "账户充值2");
}
});
}
@Async
public Future<String> add3() {
return addExecutor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread() + "账户充值2");
return "success ";
}
});
}
@Async(BeanConfig.REDUCE_EXECUTOR)
public void reduce() {
System.out.println(Thread.currentThread() + "账户提现");
}
//不指定线程池,默认primary线程池,无primary则默认使用SimpleAsyncTaskExecutor
@Async
public void transfer() {
System.out.println(Thread.currentThread() + "账户转账");
}
}
3、异步线程池定义
package com.async2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@EnableAsync
@ComponentScan
public class BeanConfig {
public static final String ADD_EXECUTOR = "addExecutor";
public static final String REDUCE_EXECUTOR = "reduceExecutor";
@Primary
@Bean(ADD_EXECUTOR)
public Executor addExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
//线程名称前缀
executor.setThreadNamePrefix("add-thread-");
return executor;
}
@Bean(REDUCE_EXECUTOR)
public Executor reduceExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100);
//线程名称前缀
executor.setThreadNamePrefix("reduce-thread-");
return executor;
}
}
4、打印输出
Thread[add-thread-1,5,main]账户充值
Thread[reduce-thread-1,5,main]账户提现
Thread[add-thread-4,5,main]账户转账
Thread[add-thread-6,5,main]账户充值2
Thread[add-thread-5,5,main]账户充值2
add3方法充值成功返回消息:success