1. 程式人生 > >Spring帶返回值的非同步任務

Spring帶返回值的非同步任務

許久之前就接觸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());
    }
}