Spring业务的异步实现
在基于注解方式的配置中,借助@EnableAsync注解进行异步启动声明
(1)在Spring Boot项目中,在启动类Application上应用@EnableAsync注解
(2)在需要异步执行的业务方法上,使用@Async方法进行异步声明
如果需要获取业务层异步方法的执行结果,AsyncResult对象可以对异步方法的执行结果进行封装,如果外界需要异步方法结果时,可以通过Future对象的get方法获取结果
Spring 自定义异步池
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class TestThreadPool {
public static void main(String[] args) {
BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue<Runnable>(1);//线程容量:阻塞队列数+最大线程数
//假如默认线程名不满足你业务需要,可以自己创建线程工厂,然后定义线程名
ThreadFactory threadFactory=new ThreadFactory() {
//AtomicLong 提供了一种线程安全的自增或自减算法对一个整数进行计算
private AtomicLong al=new AtomicLong(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "db-thread-"+al.getAndIncrement());
}
};
//1.构建一个线程池
ThreadPoolExecutor tp=new ThreadPoolExecutor(
2,//corePoolSize 核心线程数(当使用池对象执行任务时,池中线程没有达到corePoolSize设置定值时,每来一个新的任务都会创建一个新的线程)
3,//maximumPoolSize 最大线程(当核心线程都在忙,队列也满,再来新的任务则创建新线程)
60,//keepAliveTime 最大空闲时间
TimeUnit.SECONDS, //unit 时间单位
workQueue,//workQueue阻塞式队列
threadFactory,//创建线程的工厂
new ThreadPoolExecutor.CallerRunsPolicy());//任务拒绝执行策略,这里选择了CallerRunsPolicy对象(表示最后由调用者线程执行)
//2.启动池中线程执行任务
tp.execute(new Runnable() {
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+" execute task 01");
try{Thread.sleep(5000);}catch (Exception e) {}
}
});
tp.execute(new Runnable() {
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+" execute task 02");
try{Thread.sleep(5000);}catch (Exception e) {}
}
});
tp.execute(new Runnable() {
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+" execute task 03");
try{Thread.sleep(5000);}catch (Exception e) {}
}
});
tp.execute(new Runnable() {
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+" execute task 04");
try{Thread.sleep(5000);}catch (Exception e) {}
}
});
tp.execute(new Runnable() {
@Override
public void run() {
String tName=Thread.currentThread().getName();
System.out.println(tName+" execute task 05");
try{Thread.sleep(5000);}catch (Exception e) {}
}
});
}
}
执行结果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。