2013-08-16 62 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实现具有本机OS级线程的线程,包括基于OpenJDK的Oracle参考实现。

我想象一下使用'绿色线程'(线程的用户空间模拟)的JVM会使用抢占式调度,以便一个线程中的无限循环不会阻塞其他线程,但是不知道特定的实现只是猜测。

相关问题