他の人が言ったことは正しいです。java.io 内の Java の「古い I/O」ライブラリには、ブロッキング呼び出しが含まれています。しかし、彼らは忙しく待っていません。それらは I/O でブロックされており、I/O が利用可能になると、カーネルはそれらを再スケジュールします。
よくわからなかったので、自分で調べてみました。このサンプルクラスを見てください:
import java.io.*;
public class Test {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
System.out.println(line);
}
}
コマンドラインでコンパイルします。それを実行しますが、何も入力しないでください。プログラムは、文字を入力するまで入力をブロックする必要があり、Enter を入力するまで readline を通過しません。psこのプロセスの詳細をお知らせください。aからより詳細な情報を取得するには、フラグを使用しpsます。
japeters@<computer-name>] ps a
PID TT STAT TIME COMMAND
3846 s000 S 0:00.16 -zsh
3992 s000 S+ 0:00.40 /usr/bin/java Test
PSのmanページには次のように書かれています:
状態 状態は一連の文字によって与えられます。たとえば、``RWNA'' です。最初の文字は、プロセスの実行状態を示します。
- I アイドル状態 (約 20 秒以上スリープ状態) のプロセスをマークします。
- R 実行可能なプロセスをマークします。
- S 約 20 秒未満のスリープ状態のプロセスをマークします。
そして、プロセスを開始したばかりなので、Sは理にかなっています。プロセスはスリープ状態で、OS によるスケジューリングを待っています。実際、 を確認するtopと、プロセスが 0% の CPU を使用していることがわかります。
したがって、この呼び出しのパフォーマンスについて心配する必要はありません。忙しい待機やポーリングが行われることはありません。システムが I/O イベントを処理し、プロセスをインテリジェントに処理します。