Spring帶返回值的非同步任務
阿新 • • 發佈:2018-11-20
許久之前就接觸Spring非同步任務了,通過@Asyns註解標示一個非同步任務,再通過配置類@EnableAsyns開啟Spring非同步支援即可實現簡單的非同步案例,但是對於帶返回值的非同步任務則無法通過這種簡單的方法實現,此時需要非同步方法返回Future物件,而獲取的方法也有所不同,需要呼叫Future物件的get方法,這類似於通過Callable介面實現多執行緒(其實可以斷定其底層就是基於Callable介面),廢話不多說直接上程式碼。
定義非同步的業務方法:
// 非同步方法 @Async public Future<String> getStr2() { try { // 模擬延遲 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return new AsyncResult<>("返回值"); }
// 返回集合型別 @Async public Future<List<String>> getStr3() { List<String> list=new ArrayList<>(); try { // 模擬延遲 Thread.sleep(1000); list.add("張三"); list.add("李四"); list.add("王五"); list.add("趙六"); } catch (InterruptedException e) { e.printStackTrace(); } return new AsyncResult<>(list); }
獲取非同步任務返回值:
// 獲取字串返回值 @GetMapping("test2") public Object test2() throws Exception { Future<String> future = emailUtils.getStr2(); return future.get(); } // 常規的獲取方法,會返回空 @GetMapping("test3") public Object test3() { return emailUtils.getStr2(); } // 獲取集合型別 @GetMapping("test4") public Object test4() throws Exception { Future<List<String>> future = emailUtils.getStr3(); return future.get(); }
既然話都說到這裡了,就再複習下Callable介面吧:
package com.lsm1998.test.Thread;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class CallableTest implements Callable<String>
{
@Override
public String call() throws Exception
{
Thread.sleep(1000);
return "hello";
}
public static void main(String[] args) throws Exception
{
FutureTask<String> task = new FutureTask<>(new CallableTest());
Thread thread = new Thread(task);
thread.start();
System.out.println("執行到此");
System.out.println("返回值=" + task.get());
// lambda表示式實現
FutureTask<String> task2 = new FutureTask<>(() -> "你好");
new Thread(task2).start();
System.out.println("執行到此");
System.out.println("返回值=" + task2.get());
}
}