2010-05-05 137 views
7

我想打一个HTTP请求,然后获得响应,勾勒这里:Java BufferedReader readline阻塞?

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 2010-05-28 08:10:38

回答

-3

一个好的操作系统会有一个调度程序,它将进程置于阻塞或类似的状态,并且任何任务开关都不会切换到被阻塞的进程。

例如, 窗口中的空闲进程是当没有进程准备好运行(睡眠,阻塞等)时运行的进程。

21

其他人说的是正确的。 Java中的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应该能够告诉我们关于这个过程的更多细节。使用a标志,以避免ps获得更详细的信息:

[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'。第一个字符 表示 过程的运行状态:

  • 标记一个过程,是空闲(昏睡长于约 20秒)。
  • R标记可运行的进程。
  • S标记睡眠时间少于约20秒的进程。

而且因为我刚开始的过程中,小号是有道理的。该进程正在休眠,正在等待OS调度。事实上,如果你检查top,你会注意到这个过程正在占用0%的CPU。

所以不要担心这个调用的性能,没有忙于等待或轮询进行:系统正在为您处理I/O事件,并将智能地处理您的过程。

相关问题