先物
先物はJava 5(2004)で導入されました。これらは基本的に、まだ完了していない操作の結果のプレースホルダーです。操作が完了するFuture
と、にその結果が含まれます。たとえば、操作は、ExecutorServiceに送信されるRunnableまたはCallableインスタンスにすることができます。。操作の送信者は、Future
オブジェクトを使用して、操作がisDone()であるかどうかを確認するか、ブロッキングget()メソッドを使用して操作が完了するのを待ちます。
例:
/**
* A task that sleeps for a second, then returns 1
**/
public static class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(1000);
return 1;
}
}
public static void main(String[] args) throws Exception{
ExecutorService exec = Executors.newSingleThreadExecutor();
Future<Integer> f = exec.submit(new MyCallable());
System.out.println(f.isDone()); //False
System.out.println(f.get()); //Waits until the task is done, then prints 1
}
CompletableFutures
CompletableFuturesはJava 8(2014)で導入されました。これらは実際、グアバの一部であるGoogleのListenable Futuresに触発された通常のFuturesの進化形です。ライブラリのます。これらはFutureであり、タスクをチェーンでつなぐこともできます。それらを使用して、「いくつかのタスクXを実行し、完了したらXの結果を使用して別のことを行う」ようにいくつかのワーカースレッドに指示できます。CompletableFuturesを使用すると、実際にスレッドをブロックして結果を待つことなく、操作の結果を処理できます。以下に簡単な例を示します。
/**
* A supplier that sleeps for a second, and then returns one
**/
public static class MySupplier implements Supplier<Integer> {
@Override
public Integer get() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//Do nothing
}
return 1;
}
}
/**
* A (pure) function that adds one to a given Integer
**/
public static class PlusOne implements Function<Integer, Integer> {
@Override
public Integer apply(Integer x) {
return x + 1;
}
}
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newSingleThreadExecutor();
CompletableFuture<Integer> f = CompletableFuture.supplyAsync(new MySupplier(), exec);
System.out.println(f.isDone()); // False
CompletableFuture<Integer> f2 = f.thenApply(new PlusOne());
System.out.println(f2.get()); // Waits until the "calculation" is done, then prints 2
}
RxJava
RxJavaはリアクティブプログラミング用のライブラリ全体です、Netflixで作成されたです。一見すると、Java 8のストリームに似ているように見えます。それは、それがはるかに強力であることを除いてです。
Futuresと同様に、RxJavaを使用して、一連の同期アクションまたは非同期アクションをつなぎ合わせて、処理パイプラインを作成できます。使い捨てのFutureとは異なり、RxJava は0個以上のアイテムのストリームで機能します。無限の数のアイテムで終わることのないストリームを含みます。また、信じられないほど豊富なおかげで、はるかに柔軟で強力です演算子のセットのです。
Java 8のストリームとは異なり、RxJavaにはバックプレッシャーメカニズムもあり、処理パイプラインのさまざまな部分がさまざまなスレッドで動作するケースを処理できます。でさまざまなレートでます。
RxJavaの欠点は、ドキュメントがしっかりしているにもかかわらず、パラダイムシフトが関係しているため、学ぶのが難しいライブラリであることです。特に複数のスレッドが関係している場合、Rxコードはデバッグの悪夢にもなり得ます。
知りたい場合は、公式Webサイトにさまざまなチュートリアルの全ページに加えて、公式ドキュメントとJavadocがあります。また、次のようなビデオのいくつかを見ることができます Rxの簡単な紹介と、RxとFuturesの違いについて説明しこのます。
ボーナス:Java 9 Reactive Streams
Java 9のReactive Streams別名Flow APIは、RxJava 2、Akka Streams、Vertxなどのさまざまなリアクティブストリームライブラリによって実装される一連のインターフェースです。それらは、すべての重要なバックプレッシャーを維持しながら、これらの反応ライブラリーが相互接続することを可能にします。