Java 线程是在用户空间还是在内核空间中创建的?

2022-09-04 07:02:06

查看此代码

    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

Java 线程是“用户”线程,但在底层,Java 虚拟机使用内核线程,并在其内核线程池中的每个内核线程上委派用户线程的 CPU 时间。有关更好的解释,请参阅此问题。似乎线程是特定于JVM供应商的,我的理解可能不适用于所有JVM实现。


答案 2

大多数JVM使用本机操作系统级线程实现线程,包括基于OpenJDK的Oracle参考实现。

我想使用“绿色线程”(线程的用户空间模拟)的JVM将使用抢占式调度,以便一个线程中的无限循环不会阻塞其他线程,但是如果不了解特定的实现,这只是推测。