-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)
首先,您不会告诉我们您所看到的输出以及您希望看到的输出。因此,无法解释前者,也无法解释后者为何会偏离基准。
但是,有许多因素可以解释为什么输出与您期望的不同。
输出可能取决于系统上的内核(或超线程)数量。以及操作系统可用于您的Java应用程序的数量。
如果在Java应用程序本身或系统的其他部分中运行着更高优先级的线程,那将会干扰时间分配。(如果需要调度高优先级线程,则可以缩短低优先级线程的时间片。)
Java线程的重新调度不只是由于时间限制而发生。当线程确实阻止I / O或尝试获取a Lock或互斥量或wait(...)or sleep(...)或类似物时,也会发生这种情况。
System.out.println 在后台进行了一些隐藏的同步,因此,同时打印两个线程不会导致共享缓冲区数据结构的损坏。
简而言之,无论您从该程序看到什么输出,都不会清楚地表明时间分割行为。(我的猜测是,这根本没有任何意义的证据。)
但是,您的问题的答案是:
Java线程拥有CPU时间片多长时间?
就是无法预测,并且很难衡量。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |