2013-08-16 14 views
5

チェックアウトこのコードをユーザ空間またはカーネル空間にJavaスレッドが作成されていますか?

Thread t1 = new Thread(new Runnable() { 

     @Override 
     public void run() 
     { 
      try 
      { 
       System.out.println("STARTING SERVER..."); 
       ServerSocket s = new ServerSocket(2544); 
       System.out.println("SERVER BLOCKED ON ACCEPT"); 
       Socket ss = s.accept(); 
       System.out.println("SERVER NOT BLOCKED ANYMORE"); 
      } 
      catch(Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
    }); 
    t1.start(); 



    Thread t2 = new Thread(new Runnable() { 

     @Override 
     public void run() 
     { 
      try 
      { 
       while(true) 
       { 
        Thread.sleep(1000); 
        System.out.println("Hello"); 
       } 
      } 
      catch(Exception ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
    }); 
    t2.start(); 

出力:

STARTING SERVER... 
SERVER BLOCKED ON ACCEPT 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
... 

Javaスレッドは右、ユーザ空間スレッドすべきですか?したがって、ブロックされたスレッドはプロセス全体をブロックする必要があります。何が起こっているのですか?

+2

ブロックされたスレッドがプロセス全体をブロックすると、マルチスレッドの要点は何ですか? –

+0

ユーザスペーススレッドは、カーネルスレッド – fredcrs

+0

@fredcrsはいのプログラムカウンタ、スタックなどをロードする必要がないので、リソースを消費しませんが、実際にはうまく機能しません。 –

答えて

11

Javaスレッドは「ユーザー」スレッドですが、Java仮想マシンはカーネルスレッドを使用しており、ユーザースレッドのCPU時間をそのカーネルスレッドプールの各カーネルスレッドに委任しています。詳しくは、this questionを参照してください。スレッド化はJVMベンダー固有のものであり、すべてのJVM実装で理解できないことがあります。

4

ほとんどのJVMは、OpenJDKに基づくOracle参照実装を含む、ネイティブのOSレベルのスレッドでスレッドを実装します。

「グリーンスレッド」(スレッドのユーザー空間シミュレーション)を使用するJVMは、あるスレッドの無限ループが他のスレッドをブロックしないようにプリエンプティブスケジューリングを使用すると考えていますが、ちょうど投機。

関連する問題