12

このコードをチェックしてください

    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 スレッドはユーザー空間スレッドであるべきですよね?したがって、1 つのブロックされたスレッドがプロセス全体をブロックするはずです...それは起こったことではありません。彼らに何が起こっているのですか?

4

3 に答える 3

20

Java スレッドは「ユーザー」スレッドですが、内部では、Java 仮想マシンはカーネル スレッドを使用し、カーネル スレッド プール内の各カーネル スレッドでユーザー スレッドの CPU 時間を委任しています。より良い説明については、この質問を参照してください。スレッド化は JVM ベンダー固有のようであり、私の理解はすべての JVM 実装に当てはまるとは限りません。

于 2013-08-16T16:54:01.820 に答える