<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java `Callable Future`示例 > 原文: [https://howtodoinjava.com/java/multi-threading/java-callable-future-example/](https://howtodoinjava.com/java/multi-threading/java-callable-future-example/) [Java 執行器框架](https://howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/ "executor")的好處之一是,我們可以運行并發任務,這些并發任務在處理任務后可以返回單個結果。 [Java 并發](https://howtodoinjava.com/java-concurrency-tutorial/) API 通過以下兩個接口[`Callable`](https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/Callable.html "Callable")和[`Future`](https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/Future.html "Future")實現此目的。 ## 1\. Java `Callable`和`Future`接口 #### 1.1 `Callable` `Callable`接口具有`call()`方法。 在這種方法中,我們必須實現任務的邏輯。 `Callable`接口是一個參數化接口,這意味著我們必須指出`call()`方法將返回的數據類型。 #### 2.2 `Future` `Future`接口具有獲取`Callable`對象生成的結果并管理其狀態的方法。 ## 2\. Java `Callable Future`示例 在此示例中,我們正在創建類型為`Callable`的`FactorialCalculator`。 這意味著我們將覆蓋它的`call()`方法,計算后,我們將從`call()`方法返回結果。 以后可以從主程序保存的`Future`參考中檢索此結果。 ```java public class FactorialCalculator implements Callable<Integer> { private Integer number; public FactorialCalculator(Integer number) { this.number = number; } @Override public Integer call() throws Exception { int result = 1; if ((number == 0) || (number == 1)) { result = 1; } else { for (int i = 2; i <= number; i++) { result *= i; TimeUnit.MILLISECONDS.sleep(20); } } System.out.println("Result for number - " + number + " -> " + result); return result; } } ``` 現在,我們使用兩個線程和 4 個數字測試上述階乘計算器。 ```java package com.howtodoinjava.demo.multithreading; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class CallableExample { public static void main(String[] args) { ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); List<Future<Integer>> resultList = new ArrayList<>(); Random random = new Random(); for (int i=0; i<4; i++) { Integer number = random.nextInt(10); FactorialCalculator calculator = new FactorialCalculator(number); Future<Integer> result = executor.submit(calculator); resultList.add(result); } for(Future<Integer> future : resultList) { try { System.out.println("Future result is - " + " - " + future.get() + "; And Task done is " + future.isDone()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } //shut down the executor service now executor.shutdown(); } } ``` 程序輸出。 ```java Result for number - 4 -> 24 Result for number - 6 -> 720 Future result is - - 720; And Task done is true Future result is - - 24; And Task done is true Result for number - 2 -> 2 Result for number - 6 -> 720 Future result is - - 720; And Task done is true Future result is - - 2; And Task done is true ``` 在這里,我們使用`submit()`方法發送了一個`Callable`對象,該對象將在執行器中執行。 此方法接收`Callable`對象作為參數,并返回一個`Future`對象,我們可以將其用于兩個主要目標: 1. **我們可以控制任務的狀態** – 我們可以取消任務并檢查任務是否完成。 為此,我們使用`isDone()`方法檢查任務是否完成。 2. **我們可以通過`call()`方法返回結果**。為此,我們使用了`get()`方法。 該方法一直等到`Callable`對象完成對`call()`方法的執行并返回其結果。 如果在`get()`方法等待結果時線程被中斷,則它將引發`InterruptedException`異常。 如果`call()`方法引發異常,則此方法引發`ExecutionException`異常。 `Future`接口提供了`get()`方法的另一個版本,即`get(longtimeout, TimeUnitunit)`。 如果任務的結果不可用,則此版本的`get`方法將等待指定的時間。 如果經過指定的時間段且結果尚不可用,則該方法將返回`null`值。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看