2010-05-05 3 views
7

내가 HTTP 요청을하고 응답을 얻으려면 :Java BufferedReader readline blocking? 여기 스케치로

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()? 이 프로세스는 CPU에서 계속 실행/실행 가능하게 유지됩니까? 아니면 CPU에서 벗어나서 IO를 읽을 때 다시 깨어나고 실행될 것입니까?

CPU에 남아있는 경우 나중에 내리고 알림을 받기 위해 수행 할 수있는 작업은 무엇입니까?

+6

이러한 답변 중 어떤 것이 귀하의 질문을 충분히 설명 했습니까? 그렇다면 아마 당신의 대답으로 하나를 표시해야합니다. 그렇지 않다면 질문을 편집하여 아직 명확하지 않은 것을 철자하십시오. – jasonmp85

답변

-3

우수한 운영 체제는 프로세스를 차단 된 상태 또는 유사한 상태로 만드는 스케줄러를 가지며 모든 작업 스위치는 차단 된 프로세스로 전환하지 않습니다.

예 : Windows에서 유휴 프로세스는 실행 준비가 된 프로세스가없는 경우 (절전, 차단 등) 실행되는 프로세스입니다.

21

다른 사람들의 의견은 정확합니다. 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); 
    } 
} 

그리고 명령 줄에서 컴파일하십시오. 그런 다음 실행 시키되 아무 것도 입력하지 마십시오. 문자를 입력 할 때까지 프로그램이 입력에 대해 차단되어야하며 입력 할 때까지 readline을 지나서 진행되지 않습니다. ps은이 프로세스에 대한 자세한 내용을 알려줄 수 있어야합니다. ps에서 더 자세한 정보를 얻을 수 a 플래그를 사용

[email protected]<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 에 대한 초 이상 수면) 유휴 프로세스 : 첫 번째 문자 는 프로세스의 실행 상태를 나타냅니다.
  • 실행 가능한 프로세스를 표시합니다.
  • S 약 20 초 미만으로 대기중인 프로세스를 표시합니다. 난 그냥 과정을 시작한 이후

는 그리고, S는 의미가 있습니다. 프로세스는 OS에 의한 스케줄링을 기다리고 자고 있습니다. 실제로 top을 확인하면 프로세스가 0 % CPU를 사용하고 있음을 알 수 있습니다.

이 호출의 성능에 대해 걱정할 필요가 없습니다. 대기 중이거나 폴링 중이므로 시스템이 사용자를 위해 I/O 이벤트를 처리하고 프로세스를 지능적으로 처리합니다.