0%

Spring中异步执行方法

文章字数:263,阅读全文大约需要1分钟

java程序与第三方系统交互的时候使用同步容易造成响应迟缓,解决方法除了多线程之外还可以使用Spring内置的@Async来解决这个问题

开启注解

1
2
3
4
5
6
7
8
9
//springBoot启动类上开启
@ComponentScan(basePackages = { "com.xwj.controller", "com.xwj.service" })
@EnableAsync //开启异步调用
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}

无返回值调用

1
2
3
4
@Async  //标注使用
public void asyncMethodWithVoidReturnType() {
System.out.println("获取:"+ Thread.currentThread().getName());
}

有返回值

异步方法

1
2
3
4
5
6
7
8
9
//Future接口类型的get方法可以在没有执行之前阻塞,直到获取到值
@Async
public Future<String> asyncMethodWithReturnType() {
try{
Thread.sleep(5000);//模拟执行耗时
return new AsynResult<String>("hello");//返回类型是AsynResult;
}
return null;
}

调用

1
2
3
4
5
6
7
public void test() throws InterruptedException, ExecutionException{
Future<String> future = asyncMethodWithReturnType();//调用
future.get();//获取结果,如果工作没结束阻塞线程。
future.cancel(boolean mayInterruptIfRunning);//停止任务,通过传入值判断是否可以停止。如果可以(在运行)返回true,不可以(运行结束,或无法停止)返回false。
future.isDone();//判断方法是否完成
future.isCancel();//是否可以被取消
}

Future接口

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args)throws InterruptedException,ExecutionException{
Callable ca1 = new Callable(){//线程1
@Override
public String call() throws Exception{
return "xxx";
}
//使用FutureTask包裹
FutureTask<String> ft1 = new FutureTask<String>(ca1);
new Thread(ft1).start();//运行
System.out.println(ft1.get());//获取值
}
}