開心生活站

位置:首頁 > IT科技 > 

java,future

IT科技9.66K

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

很多朋友都想知道java future是什麼,下面就一起來了解一下吧~

Future代表一個異步計算的結果,並且它提供一些方法來讓調用者檢測異步過程是否完成,或者取得異步計算的結果,或者取消正在執行的異步任務。

public class Test {    private static ExecutorService executorService = Executors.newSingleThreadExecutor();    public static void main(String[]args){        System.out.println("hello world");        Future<Integer>future = calcute(9);        while (!future.isDone()){            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                System.out.println("正在執行");            }        }        try {            int result = future.get();            System.out.println("result = " + result);        } catch (ExecutionException e) {            e.printStackTrace();        } catch (InterruptedException e) {            e.printStackTrace();        }    }        public static Future<Integer>calcute(Integer i) {        return executorService.submit(() -> {            Thread.sleep(1000);            System.out.println("return future for " + i);            return i *i;        });    }}

一個簡單Future使用用例寫完,使用線程池+Callback+Future,完成了一個簡單的計算操作。

java future

Future是一個接口,先看一下內部方法:

public interface Future<V> {    boolean cancel(boolean var1);    boolean isCancelled();    boolean isDone();    V get() throws ExecutionException, InterruptedException;    V get(long var1, TimeUnit var3) throws ExecutionException, InterruptedException, TimeoutException;}

get()函數是返回計算結果,注意get會同步操作,沒有返回結果前,會阻塞線程。
get還有一個重載函數get(long var1, TimeUnit var3),第一個參數是時長,第二個是單位。
表示在多少時長內獲取結果,如果仍未返回,則拋出異常TimeoutException。

try{    int result2 = future2.get(1000, TimeUnit.MILLISECONDS);} catch(TimeoutException e) {    e.printStackTrace();}

cancel(boolean) 表示是否取消該future,

不能在調用cancel(true)/cancel(false)後,調用get()函數,否則會拋出異常CancellationException

isCancelled()函數是判斷該future是否已取消

isDone()函數是判斷該future是否已完成

isDone()函數是實時狀態讀取,不會阻塞線程。

Callback

Callback 是一個接口,內部只有一個函數

@FunctionalInterfacepublic interface Callable<V> {    V call() throws Exception;}

標籤:future java