AsynchronousByteChannel.read()の Javadoc には、操作が非同期で行われると書かれていますが、ストリームの終わりに到達するとどうなりますか? 実装は、read() を呼び出した同じスレッド内で完了ハンドラーを起動できますか? 実装の観点からは、結果が既にわかっているため、この操作を非同期で実行する理由はありません。同様に、ユーザーが、remaining() が 0 を返す ByteBuffer に読み込もうとすると、読み取り操作は 0 を返さなければならないことがわかります。
私自身の AsynchronousByteChannel 実装で競合状態に陥ったため、質問します。操作が完了すると、それ自体で notify() を呼び出す完了ハンドラーを呼び出しています。次に、次のユーザー コードを呼び出します。
CompletionHandler<?, ?> handler = ...;
synchronized (handler)
{
asyncByteChannel.read(handler);
handler.wait();
}
ユーザーは、操作が完了するとハンドラーに通知されると想定していますが、read() は実際には完了ハンドラーを同期的に呼び出すため、wait() の前に通知され、後者は永久にブロックされます。
仕様では、別のスレッドで CompletionHandler を更新する必要がありますか?それとも、read() を呼び出すスレッドが一部の操作を同期的に実行する可能性があるという事実をユーザーが認識する必要がありますか?