<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java `Future`教程 原文:http://zetcode.com/java/future/ Java `Future`教程展示了如何使用`Future`在 Java 中進行異步編程。 `Future`表示異步計算的結果。 提供了一些方法來檢查計算是否完成,等待其完成以及檢索計算結果。 簡而言之,一旦某個操作完成,就有望保留該操作的結果。 `Future`是 Java 5 中引入的。 該值是使用`get()`從將來檢索的,該值將阻塞直到值準備就緒。 `FutureTask`類是實現`Runnable`的`Future`的實現,因此可以由`Executor`執行。 `Future`有幾個缺點。 例如,它們無法手動完成,并且它們不會在完成時通知。 `Future`不能被鏈接和組合。 另外,沒有異常處理。 為了解決此缺點,Java8 引入了`CompletableFuture`。 ## Java `Future`示例 以下示例使用`Future`來計算階乘。 `com/zetcode/FactorialCalculator.java` ```java package com.zetcode; import java.math.BigInteger; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; public class FactorialCalculator implements Callable<BigInteger> { private int value; public FactorialCalculator(int value) { this.value = value; } @Override public BigInteger call() throws Exception { var result = BigInteger.valueOf(1); if (value == 0 || value == 1) { result = BigInteger.valueOf(1); } else { for (int i = 2; i <= value; i++) { result = result.multiply(BigInteger.valueOf(i)); } } TimeUnit.MILLISECONDS.sleep(500); return result; } } ``` `FactorialCalculator`使用`BigInteger`計算階乘。 ```java public class FactorialCalculator implements Callable<BigInteger> { ``` `FactorialCalculator`實現了`Callable`。 `Callable`代表返回結果的異步任務。 在我們的例子中,結果是計算的階乘。 ```java TimeUnit.MILLISECONDS.sleep(1500); ``` 我們稍微減慢了計算速度。 `com/zetcode/JavaFutureEx.java` ```java package com.zetcode; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; public class JavaFutureEx { public static void main(String[] args) throws ExecutionException, InterruptedException { var executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); List<Map<Integer, Future<BigInteger>>> resultList = new ArrayList<>(); var random = new Random(); for (int i = 0; i < 6; i++) { int number = random.nextInt(100) + 10; var factorialCalculator = new FactorialCalculator(number); Map<Integer, Future<BigInteger>> result = new HashMap<>(); result.put(number, executor.submit(factorialCalculator)); resultList.add(result); } for (Map<Integer, Future<BigInteger>> pair : resultList) { var optional = pair.keySet().stream().findFirst(); if (!optional.isPresent()) { return; } var key = optional.get(); System.out.printf("Value is: %d%n", key); var future = pair.get(key); var result = future.get(); var isDone = future.isDone(); System.out.printf("Result is %d%n", result); System.out.printf("Task done: %b%n", isDone); System.out.println("--------------------"); } executor.shutdown(); } } ``` 我們生成六個隨機整數并計算它們的階乘。 ```java var executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); ``` 執行程序服務處理異步任務的生命周期。 它的`submit()`可以接受`Runnable`和`Callable`對象。 ```java var factorialCalculator = new FactorialCalculator(number); ``` 創建一個`FactorialCalculator`任務。 它將異步運行。 ```java Map<Integer, Future<BigInteger>> result = new HashMap<>(); result.put(number, executor.submit(factorialCalculator)); resultList.add(result); ``` 我們將任務提交給執行者。 我們將整數值和`Future`放置在映射上,以便手邊有值和計算出的階乘。 ```java for (Map<Integer, Future<BigInteger>> pair : resultList) { ``` 我們瀏覽結果列表。 請注意,`Future`在計算其值之前會迅速返回。 ```java var optional = pair.keySet().stream().findFirst(); if (!optional.isPresent()) { return; } var key = optional.get(); ``` 我們得到了一對的鑰匙。 ```java var future = pair.get(key); var result = future.get(); ``` 使用鑰匙,我們將擁有未來。 當我們調用`get()`時,處理被阻塞,直到檢索到該值為止。 ```java Value is: 39 Result is 20397882081197443358640281739902897356800000000 Task done: true -------------------- Value is: 99 Result is 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000 Task done: true -------------------- Value is: 39 Result is 20397882081197443358640281739902897356800000000 Task done: true -------------------- Value is: 102 Result is 961446671503512660926865558697259548455355905059659464369444714048531715130254590603314961882364451384985595980362059157503710042865532928000000000000000000000000 Task done: true -------------------- Value is: 12 Result is 479001600 Task done: true -------------------- Value is: 49 Result is 608281864034267560872252163321295376887552831379210240000000000 Task done: true -------------------- ``` 這是一個示例輸出。 在本教程中,我們使用了 Java 的`Future`。 列出[所有 Java 教程](/all/#java)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看