2016-12-14 1 views
2

私はこれを正しく理解していれば、オブジェクトの待機を呼び出すとスレッドが待機状態になり、オブジェクトのロックを待っているときにブロック状態になります(同期ブロックに入るときなどまたは方法)。read()のようなI/Oメソッドは、スレッドをJavaのブロック状態にしますか?

read()のようなI/Oメソッドはスレッドをブロック状態にしてもどうしますか?私はブロックされた状態でなければならないことを理解していますが、読み込み可能なデータを待っていますが、私はまたHOWに興味があります。 JVMは、読み込みしようとしているリソースのデータが再び利用可能になったときに、スレッドが続行できることをスレッドにどのように通知しますか?

答えて

4

ではなく、いくつかのデータがあるまでOSはreadから戻らないとOSが決定BLOCKED

public static void main(String[] args) throws IOException { 
    Thread main = Thread.currentThread(); 
    new Thread(() -> { 
     for (int i = 0; i < 10; i++) { 
      System.out.println(main + " is in "+main.getState()+" state"); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       throw new AssertionError(e); 
      } 
     } 
    }).start(); 
    System.in.read(); 
} 

プリント

Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 
Thread[main,5,main] is in RUNNABLE state 

にスレッドの状態を変更しません。スレッド/プロセスをコンテキスト切り替えするかどうか、またいつ切り替えるか。

JVMは、読み込みしようとしているリソースのデータが再び利用可能になったときに、スレッドが続行できることをスレッドにどのように通知しますか?

さらにデータがあるとき、またはストリームが閉じているときにOSがスレッドをウェイクアップします。 JVMは関与しません。

0

これはネイティブプラットフォームによって異なります。

readの呼び出しは、通常、データが利用可能になるまでブロックしますが、ファイルの終わりに達した、ファイル記述子が閉じられた、操作がタイムアウトした、または信号が操作を中断しました。

Windowsでは、最も密接に関連する機能はReadFileです。


血みどろの詳細は、Java(登録商標)8のアップデート112 B15を参照のうえ:

ネイティブFileInputStream.read0を呼び出しFileInputStream.readIO_Readを呼び出す、readSingleを呼び出す、Java_java_io_FileInputStream_read0にJNIを介してネイティブに実装。

POSIXでは、IO_ReadhandleReadと定義され、readを呼び出します。 RESTARTABLEマクロがループしている間にエラーが発生し、errnoEINTRです。

Windowsでは、IO_Readは、ReadFileを呼び出すhandleReadと定義されています。

関連する問題