Java BufferedReader блокировка чтения строки? - PullRequest
7 голосов
/ 06 мая 2010

Я хочу сделать 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 () выше? Будет ли этот процесс работать / запускаться на процессоре или он будет снят с процессора и получит уведомление о том, что он проснется и снова запустится, когда будет считан ввод-вывод?

Если он остается на процессоре, что можно сделать, чтобы он отключился и получил уведомление позже?

Ответы [ 2 ]

21 голосов
/ 20 мая 2010

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

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

0 голосов
/ 06 мая 2010

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

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

...