Я хочу сделать Запрос HTTP и затем получить ответ, как коротко изложено здесь:
URLConnection c = new URL("http://foo.com").openConnection();
c.setDoOutput(true);
/* write an http request here using a new OutputStreamWriter(c.getOutputStream) */
BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream));
reader.readLine();
Но мой вопрос, если запрос, который я отправляю, занимает много времени, прежде чем ответ получен, что происходит в вызове reader.readLine () выше? Этот процесс останется под управлением/выполнимым на ЦП, или он будет снят ЦП и уведомить, чтобы проснуться и работать снова, когда будет IO, который будет считан?
Если это остается на ЦП, что может быть сделано, чтобы заставить его выйти и уведомляется позже?
A в хорошей ОС будет планировщик, который переводит процесс в заблокированное или подобное состояние, и любые переключатели задач не будут переключаться на заблокированный процесс.
Например, Процесс ожидания в Windows - это то, что выполняется, когда нет готовых к запуску процессов (спящих, заблокированных и т. Д.).
То, что другие сказали, правильно. Библиотека «старого ввода-вывода» Java в 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);
}
}
и скомпилируйте его в командной строке. Затем запустите его, но ничего не вводите. Программа должна блокировать ввод до тех пор, пока вы не наберете символ, и она не продвинется дальше строки чтения, пока вы не введете ввод. 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 говорится:
state Состояние задается последовательность символов, например, `` RWNA ''. Первый персонаж указывает состояние работы process:
- I Помечает процесс, который бездействует (спит дольше примерно 20 секунд).
- R Обозначает работающий процесс.
- S Отмечает процесс, который находится в спящем режиме менее 20 секунд.
И поскольку я только начал процесс, S имеет смысл. Процесс находится в спящем режиме, ожидая расписания ОС.В самом деле, если вы проверите top
, вы заметите, что процесс занимает 0% ЦП.
Так что не беспокойтесь о производительности этого вызова, здесь нет занятого ожидания или опроса: система заботится о событиях ввода-вывода за вас и будет разумно обрабатывать ваш процесс.