以下のエディターは、Java の Future モードに関する決まり文句を提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。編集者と一緒に見に来てください
jdk1.7.0_79
この記事は、実際には上記の「ThreadPoolExecutorスレッドプールのsubmitメソッドについて簡単に説明」の続きまたは続編です。 」補充してください。 FutureTask が上記の submit メソッドに出現したため、停止して Java の Future モードに切り替える必要がありました。
Future は同時プログラミングの 設計パターン です。マルチスレッドの場合、スレッド A はスレッド B の結果を待つ必要があります。常に B を待つ必要はなく、最初に将来の Future を取得できます。 B がそれを取得するまで待ち、結果の後で実際の結果を取得します。
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(callable); //主线程需要callable线程的结果,先拿到一个未来的Future System.out.println(future.get()); //有了结果后再根据get方法取真实的结果,当然如果此时callable线程如果没有执行完get方法会阻塞执行完,如果执行完则直接返回结果或抛出异常
つまり、Future は非同期計算の結果を表します。
上記は、Future モードの実行原理を表しています。オンラインの例によれば、Future モードを自分で実装できます。上記のプログラムの Future モードの実装を注意深く読むと、Future モードが非同期リクエストと
プロキシ モードの組み合わせであることがわかります。もちろん、Future モードは JDK に実装されています。
RealData クラスを変更します:package com.future;
/**
* 数据结果
* Created by yulinfeng on 6/18/17.
*/
public interface Data {
String getResult() throws InterruptedException;
}
package com.future; /** * 结果的真实计算过程 * Created by yulinfeng on 6/18/17. */ public class RealData implements Data { protected String data; public RealData(String data) { try { System.out.println("正在计算结果"); Thread.sleep(3000); //模拟计算 } catch (InterruptedException e) { e.printStackTrace(); } this.data = data + “ world”; } public String getResult() throws InterruptedException { return data; } }
次に、上記で解決されていない AbstractExecutorService#submit メソッドに戻ります。
上記の Client#request メソッドと同様に、FutureData インスタンスが最初に Client#request で作成され、FutureTask インスタンスが AbstractExecutorService#submit で作成され、次に Client#request によってタスクの非同期実行用の新しいスレッドが作成され、直接実行されます。 FutureData を返します。AbstractExecutorService#submit では、タスクも実行メソッドに渡され、FutureTask を直接返します。もちろん、JDK での Future モードの実装はさらに複雑です。
「
ThreadPoolExecutor スレッド プールの原則とその実行メソッド」では、ThreadPoolExecutor$Worker#runWorker メソッドの 1145 行目は、タスク task の呼び出しです。 . 、実際に実行されるのはFutureTaskのrunメソッドです。 FutureTask#run では、Callable タイプのタスクの非同期実行と結果の保存を確認できます。
以上がJavaのFutureパターンの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。