Блокирование Java BufferedReader readline?

Я хочу сделать Запрос 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, который будет считан?

Если это остается на ЦП, что может быть сделано, чтобы заставить его выйти и уведомляется позже?

7
задан jasonmp85 3 June 2010 в 11:28
поделиться

2 ответа

A в хорошей ОС будет планировщик, который переводит процесс в заблокированное или подобное состояние, и любые переключатели задач не будут переключаться на заблокированный процесс.

Например, Процесс ожидания в Windows - это то, что выполняется, когда нет готовых к запуску процессов (спящих, заблокированных и т. Д.).

-3
ответ дан 6 December 2019 в 10:48
поделиться

То, что другие сказали, правильно. Библиотека «старого ввода-вывода» 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% ЦП.

Так что не беспокойтесь о производительности этого вызова, здесь нет занятого ожидания или опроса: система заботится о событиях ввода-вывода за вас и будет разумно обрабатывать ваш процесс.

21
ответ дан 6 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: