天天看點

Future

Future

一、簡介

通常情況下,我們在寫多線程任務時,都是實作run方法,大家注意到run方法是沒有傳回值的。如果我們要用到其他線程的傳回值該怎麼辦呢?

這裡就要用到Future了。

Future是通過Callable實作的,是一種可生成結果的Runnable。當運作完成以後,可以通過Future.get擷取結果。

Future.get取決于任務的狀态,如果任務沒有完成,則get方法一直阻塞,直到任務完成。

下面來看具體的執行個體

二、執行個體

public class Ha {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Callable<String> callable = () -> {
            System.out.println("分線程正在進行");
            Thread.sleep(10*1000);
            System.out.println("分線程結束");
            return "分線程完成";
        };
        ExecutorService es = Executors.newSingleThreadExecutor();
        Future<String> future = es.submit(callable);
        es.shutdown();
        System.out.println("主線程工作正在進行");
        Thread.sleep(5*1000);
        System.out.println("主線程工作結束");
        String result = future.get();
        System.out.println(result);

    }
}
           

首先,我們實作Callable,模拟一個工作任務,執行時間是10秒。

通過Executors建立一個單線程任務,并執行Callable。

主線程繼續自己的工作,工作時間是5秒。

主線程擷取分線程的任務結果,由于分線程任務是10秒,是以get方法會阻塞,直到分線程任務完成。

最後列印分線程任務結果。

執行結果如下:

  • 主線程工作正在進行
  • 分線程正在進行
  • 主線程工作結束
  • 分線程結束
  • 分線程完成

上面的例子中,使用了lambda表達式,如果要運作,請使用jdk8。