Java线程拥有CPU时间片多长时间?

-2 java multithreading operating-system

Windows中每个Java线程都映射到一个内核线程,在Windows中,线程切换的时间片为10-100ms。

但是,从以下简单代码的结果来看,似乎每个线程每行代码都会切换CPU资源。为什么?

class MyThread extends Thread{
    public MyThread(String name){
        super(name);
    }
    public void run(){
        for(int i=0;i<5;i++){
              System.out.println( this.getName()+":"+i);
        }
    }
    public static void main(String args[]){
        Thread p = new MyThread("t1");
        p.start();
        for(int i=0;i<5;i++){
                System.out.println(    "main:"+i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

首先,您不会告诉我们您所看到的输出以及您希望看到的输出。因此,无法解释前者,也无法解释后者为何会偏离基准。

但是,有许多因素可以解释为什么输出与您期望的不同。

  • 输出可能取决于系统上的内核(或超线程)数量。以及操作系统可用于您的Java应用程序的数量。

  • 如果在Java应用程序本身或系统的其他部分中运行着更高优先级的线程,那将会干扰时间分配。(如果需要调度高优先级线程,则可以缩短低优先级线程的时间片。)

  • Java线程的重新调度不只是由于时间限制而发生。当线程确实阻止I / O或尝试获取a Lock或互斥量或wait(...)or sleep(...)或类似物时,也会发生这种情况。

  • System.out.println 在后台进行了一些隐藏的同步,因此,同时打印两个线程不会导致共享缓冲区数据结构的损坏。

简而言之,无论您从该程序看到什么输出,都不会清楚地表明时间分割行为。(我的猜测是,这根本没有任何意义的证据。)


但是,您的问题的答案是:

Java线程拥有CPU时间片多长时间?

就是无法预测,并且很难衡量。