springBoot @Async异步处理任务

1、启动类:添加@EnableAsync注解

@SpringBootApplication  
@EnableAsync  
public class Application{  
  
    public static void main(String[] args) {  
        SpringApplication.run(Application.class, args);  
    }  
}  

2、创建异步方法
注意:异步方法和调用方法不能在同一个类中,否者异步失效

@Service
public class AsyncService {   
    @Async
    public Future<Integer> task(int i){
    	int sum = 0
        try {
            for(int j=i;j>0;j--){
            	sum += j*j;
            }
            System.out.println(i+"方法执行结束" + new Date());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new AsyncResult<Integer>(sum);
    }
}

3、调用异步方法

@Component
public class AsyncTaskController {  
    @Autowired
	private AsyncService asyncService;
      
    @Scheduled(cron = "0 0/5 * * * ?") 
    public void doTask() throws Exception{  
       List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
       //循环调用异步方法
       for(int i=0;i<3;i++){
            //返回异步任务的结果
        	Future<Integer> future = asyncService.task(i);
        	futures.add(future )
       }
       Integer total = 0;
       //求异步的总和
       for (Future future : futures) {
            Integer total += (Integer) future.get();
       }
       System.out.println("异步任务的总和"+total)
    }  
      
}

Future接口代表异步计算的结果,通过Future接口提供的方法可以查看异步计算是否执行完成,或者等待执行结果并获取执行结果,同时还可以取消执行。Future接口的定义如下:

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
  • cancel():cancel()方法用来取消异步任务的执行。如果异步任务已经完成或者已经被取消,或者由于某些原因不能取消,则会返回false。如果任务还没有被执行,则会返回true并且异步任务不会被执行。因为run方法的执行需要state是new.如果任务已经开始执行了但是还没有执行完成,若mayInterruptIfRunning为true,则会立即中断执行任务的线程并返回true,若mayInterruptIfRunning为false,则会返回true且不会中断任务执行线程。
  • isCanceled():判断任务是否被取消,如果任务在结束(正常执行结束或者执行异常结束)前被取消则返回true,否则返回false。state>=CANCELLED
    -isDone():判断任务是否已经完成,如果完成则返回true,否则返回false。需要注意的是:任务执行过程中发生异常、任务被取消也属于任务已完成,也会返回true。state!=NEW
    -get():获取任务执行结果,如果任务还没完成(state<=COMPLETING)则会阻塞等待直到任务执行完成。如果任务被取消则会抛出CancellationException异常,如果任务执行过程发生异常则会抛出ExecutionException异常,如果阻塞等待过程中被中断则会抛出InterruptedException异常。
    -get(long timeout,Timeunit unit):带超时时间的get()版本,如果阻塞等待过程中超时则会抛出TimeoutException异常。

你可能感兴趣的:(java,spring,java,并发编程)