そして、学習の契約は、このヘルプはありコーラブルと未来、非常に興味深いタリアは、結果を得るために、結果を生成します。
呼び出し可能インターフェースはRunnableをに似ている、それが名前から見たが、結果を返さないRunnableをすることができ、および例外を投げることができない結果を返しますが、呼び出し可能な機能、より強力な、実行スレッドの後、値を返す、戻り値はすることができそれは簡単な例を見てみましょう、今後は非同期タスクの実行の戻り値を取得することができ、と言うことです、将来を得ることです:
public class CallableAndFuture {
public static void main(String[] args) {
Callable<Integer> callable = new Callable<Integer>() {
public Integer call() throws Exception {
return new Random().nextInt(100);
}
};
FutureTask<Integer> future = new FutureTask<Integer>(callable);
new Thread(future).start();
try {
Thread.sleep(5000);// 可能做一些事情
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
FutureTaskはRunnableをし、今後の二つのインターフェースを実装し、その両方のスレッドはRunnableをとして実行することができますが、また、今後の呼び出し可能として、戻り値、それが良いものですが、この組み合わせの、その後の使用を取得しますか?そこに計算するのに非常に時間のかかる戻り値があり、すぐに必要とされていない戻り値は、その後、あなたが別のスレッドで戻り値を計算し、この組み合わせを使用することができると仮定し、この戻り値を使用する前に、現在のスレッドは、他の操作を行うことができます操作は、あなたが戻り値を必要とするまで待ってから、今後、ない宮を介して取得します!ます。http://openhome.cc/Gossip/DesignPattern/FuturePattern.htmここで未来のパターンの記述があります。
のは、見てみましょう、呼び出し可能と未来を使用する別の方法ExecutorServiceのコーラブルによって実行される方法を提出し、未来を返し、次のようにコードは次のとおりです。
public class CallableAndFuture {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<Integer> future = threadPool.submit(new Callable<Integer>() {
public Integer call() throws Exception {
return new Random().nextInt(100);
}
});
try {
Thread.sleep(5000);// 可能做一些事情
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
コードは、ExecutorServiceのはエグゼキュータから継承された多くの単純化されていない、その目的は、私たちは並行プログラミングを簡素化するThreadオブジェクトを管理するために、エグゼキュータのライフサイクルは、我々は表示されませんスレッドが5 JDK後にタスクを開始するための好ましい方法で管理することです。
次のように、戻り値を持つ複数のタスクを実行し、戻り値を複数取得します。
public class CallableAndFuture {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);
for(int i = 1; i < 5; i++) {
final int taskID = i;
cs.submit(new Callable<Integer>() {
public Integer call() throws Exception {
return taskID;
}
});
}
// 可能做一些事情
for(int i = 1; i < 5; i++) {
try {
System.out.println(cs.take().get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
実際には、あなたがCompletionServiceを使用することはできません、あなたは少し、データのコレクションを最後に出て、コードをコレクションにエグゼキュータの戻り値を提出する作業で、機器のコレクションの未来型を作成し、することができます。2016年2月5日に更新され、この文のコメントは議論を引き起こし、実際には、私はそれを明確にしなかった、ごめんなさい。ここで再び手の込んだ:CompletionService未来に提出今後の練習が追加順に配置され、配置を完了するためにあります。だから、これらの2つの方法の違いはfishjamで説明したようにレビューのようなものです。