Java 9のFlow APIとは?実行手順と主要インターフェースを徹底解説
Flow APIの概要
Java 9で導入されたFlow APIは、事実上の標準となっているReactive Streams仕様に対応したAPIです。非同期処理におけるデータの発行(パブリッシュ)と購読(サブスクライブ)の中核を捉える、最小限のインターフェース群で構成されています。
以下に、Flow APIの重要なインターフェースを紹介します。
1) Flow.Publisher(パブリッシャー)
サブスクライバーが消費するためのアイテム(データ)を生成する役割を持つインターフェースです。定義されているメソッドはsubscribe(Subscriber)のみで、名前の通りサブスクライバーの購読登録を行います。
構文
void subscribe(Flow.Subscriber<? super T> subscriber)
2) Flow.Subscriber(サブスクライバー)
パブリッシャー(通常は1つ)を購読し、アイテム(onNext(T))、エラーメッセージ(onError(Throwable))、または「これ以上アイテムが届かないことを示すシグナル」(onComplete())を受け取るインターフェースです。これらのコールバックが発生する前に、パブリッシャーはonSubscribe(Subscription)メソッドを呼び出します。
構文
void onSubscribe(Flow.Subscription subscription)
void onNext(T item)
void onError(Throwable throwable)
void onComplete()
3) Flow.Subscription(サブスクリプション)
単一のパブリッシャーと単一のサブスクライバーをつなぐ接続を表すインターフェースです。サブスクライバーはこのオブジェクトを使って、追加のアイテムを要求する(request(long))ことも、接続を解除する(cancel())こともできます。
構文
void request(long n)
void cancel()
Flow APIの実行手順
Flow APIによる非同期処理は、以下の流れで実行されます。
- まず、PublisherとSubscriberを作成します。
- Publisher::subscribeを使って、サブスクライバーをパブリッシャーに登録します。
- パブリッシャーはSubscriptionを生成し、Subscriber::onSubscribeを呼び出して渡します。これにより、サブスクライバーはそのSubscriptionを保持できるようになります。
- 任意の時点で、サブスクライバーはSubscription::requestを呼び出し、受け取りたいアイテムの数を要求します。
- パブリッシャーはSubscriber::onNextを呼び出してアイテムの受け渡しを開始します。ただし、要求された数を超えるアイテムを発行することはありません。
- 処理中に何らかの問題が発生した場合、パブリッシャーはSubscriber::onErrorを、正常に完了した場合はSubscriber::onCompleteをそれぞれ呼び出します。
- サブスクライバーは必要に応じてさらにアイテムを要求し続けることもできれば、Subscription::cancelを呼び出して接続を切断することも可能です。
このように、Flow APIは「バックプレッシャー」の概念を取り入れることで、サブスクライバーの処理能力に合わせた効率的な非同期ストリーム処理を実現しています。
-
Javaクラスの静的メンバーはどのような順序で読み込まれる?JVMの処理手順を解説
Javaにおいて、静的変数(static変数)はクラスがロードされるタイミングで生成されます。これは静的ブロック(staticブロック)が実行されるよりも前の段階であり、静的ブロックの主な役割は静的変数に値を代入することです。静的変数には、定義されたクラスのすべてのインスタンス間で共有される値が格納されます。一方、静的ブロックとは、クラスが最初にロードされるときに一度だけ実行されるコード領域のことです。したがって、クラスロード時に実行したい初期化処理やロジックがある場合は、その処理を静的ブロック内に記述しておくことで、クラスのロード時に確実に実行させることができます。JVMが静的メンバーを読み
-
Javaプログラムの実行に必要な5つのステップを徹底解説
Javaプログラムが実際に動作するまでには、大きく分けて5つの主要なステップがあります。それぞれの段階で何が行われているのか、順番に詳しく見ていきましょう。 1. 編集(Edit) 最初のステップでは、プログラマーがテキストエディタやメモ帳などのシンプルなアプリケーションを使用してJavaプログラムを作成します。ソースコードを書き終えたら、ファイル名の末尾に「.java」という拡張子を付けて保存します。 2. コンパイル(Compile) 次に、javacコマンドを実行してコンパイルを行います。この処理により、「.java」ファイルはバイトコードと呼ばれる中間形式へと変換されます。バイトコ