ホームページ >Java >&#&チュートリアル >JavaのFutureパターンの詳細説明

JavaのFutureパターンの詳細説明

怪我咯
怪我咯オリジナル
2017-06-30 10:42:113615ブラウズ

以下のエディターは、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;
}
Main テスト クラスを変更します:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。