То, что сказали другие, правильно. Библиотека Java "old I / O" в java.io содержит блокирующие вызовы. Но они не заняты ожиданием. Они блокируют ввод-вывод, и ядро перенесет их, как только станет доступным ввод-вывод.
Я не был полностью уверен, поэтому я попробовал это сам. Возьмите этот пример класса:
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);
}
}
И скомпилируйте его в командной строке. Затем запустите его, но ничего не вводите. Программа должна блокировать ввод до тех пор, пока вы не введете символ, и она не будет проходить дальше 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 гласит:
состояние Состояние задается
последовательность символов, например,
`` RWNA ''. Первый персонаж
указывает на состояние выполнения
Процесс:
- I Отмечает процесс, который простаивает (длится дольше, чем около
20 секунд).
- R Отмечает работоспособный процесс.
- S Отмечает процесс, который спит менее 20
секунд.
И поскольку я только начал процесс, S имеет смысл. Процесс спит, ожидая планирования ОС. Действительно, если вы отметите top
, вы заметите, что процесс занимает 0% ЦП.
Так что не беспокойтесь о производительности этого вызова, там нет занятого ожидания или опроса: система позаботится о событиях ввода-вывода для вас и будет интеллектуально обрабатывать ваш процесс.