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) {} } }); }}
执行后果