7

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()で何が起こるかということです。このプロセスはCPU上で実行/実行可能のままですか、それともCPUから取り外され、読み取られるIOがあるときにウェイクアップして再度実行するように通知されますか?

それがCPUに残っている場合、それを降ろして後で通知するために何ができるでしょうか?

4

2 に答える 2

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);
  }
}

コマンドラインでコンパイルします。それを実行しますが、何も入力しないでください。プログラムは、文字を入力するまで入力をブロックする必要があり、Enter を入力するまで 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のmanページには次のように書かれています:

状態 状態は一連の文字によって与えられます。たとえば、``RWNA'' です。最初の文字は、プロセスの実行状態を示します。

  • I アイドル状態 (約 20 秒以上スリープ状態) のプロセスをマークします。
  • R 実行可能なプロセスをマークします。
  • S 約 20 秒未満のスリープ状態のプロセスをマークします。

そして、プロセスを開始したばかりなので、Sは理にかなっています。プロセスはスリープ状態で、OS によるスケジューリングを待っています。実際、 を確認するtopと、プロセスが 0% の CPU を使用していることがわかります。

したがって、この呼び出しのパフォーマンスについて心配する必要はありません。忙しい待機やポーリングが行われることはありません。システムが I/O イベントを処理し、プロセスをインテリジェントに処理します。

于 2010-05-20T11:42:08.107 に答える
-3

優れた OS には、プロセスをブロックされた状態または同様の状態にするスケジューラがあり、タスク スイッチはブロックされたプロセスに切り替わりません。

たとえば、Windows のアイドル プロセスは、実行する準備ができているプロセス (スリープ中、ブロック中など) がない場合に実行されるものです。

于 2010-05-05T22:43:30.527 に答える