Java线程拥有一个CPU时间片有多长?
在Windows中,每个Java线程都映射到一个内核线程,在Windows中,线程切换的时间片为10-100ms 然而,从以下简单代码的结果来看,似乎每个线程都会在每行代码中切换CPU资源。为什么?Java线程拥有一个CPU时间片有多长?,java,multithreading,operating-system,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++){
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);
}
}
}
类MyThread扩展线程{
公共MyThread(字符串名称){
超级(姓名);
}
公开募捐{
对于(int i=0;i首先,你没有告诉我们你看到了什么输出以及你期望看到什么。因此,不可能解释前者,或者为什么后者可能偏离基准
然而,有许多因素可以解释为什么输出与您期望的不同
- 输出可能取决于系统上的内核(或超线程)数量,以及操作系统提供给Java应用程序的内核数量
- 如果Java应用程序本身或系统的其他部分中运行的线程优先级较高,则会干扰时间切片(如果需要调度高优先级线程,则低优先级线程的时间切片可能会缩短)
- Java线程重新调度不仅仅是由于时间切片而发生的。当线程阻塞I/O时,或者当它试图获取
锁
或互斥锁时,或者当等待(…)
或睡眠(…)
或类似情况时,也会发生这种情况
System.out.println
在后台进行一些隐藏的同步,这样两个线程同时打印不会导致共享缓冲区数据结构损坏
简言之,无论您从该程序中看到什么输出,它都不会是时间切片行为的明确证据(我的猜测是,它根本不是任何重要的证据)
但你的问题的答案是:
Java线程拥有一个CPU时间片有多长
这是不可能预测的,而且很难测量。System.out.println
是一个阻塞操作,与您正在执行的所有操作相比,它需要花费大量时间。它还同步,因此一次只能有一个线程打印一行
这会导致您看到的交替行为。当一个线程正在打印时,另一个线程有足够的时间准备打印,请调用println
,然后等待第一个线程完成。当第一个线程完成打印时,第二个线程开始打印,第一个线程将返回,等待第一个线程完成打印完成。预期和实际输出是什么?另请注意:您的代码中最耗时的活动是打印语句。这些语句指向相同的输出,具有各种奇怪的效果…我很好奇您如何知道它根据您的示例切换CPU?系统。out
是一个缓冲的打印流执行不一定是您在控制台上看到的。但是,是的,每个Java线程都有一个由操作系统调度的本机线程。给定多个CPU,单个线程不应该在同一个CPU上获得全部时间?否@prayagupd…除了Java进程/线程外,操作系统通常还有许多其他进程要调度。Re,“…不可能预测。”更准确的说法可能是,“未定义”。Java语言规范中没有任何内容限制线程调度使用任何特定持续时间的时间片。@SolomonSlow-您的陈述和我的陈述都是100%准确的。但我认为我的陈述更符合所提出的问题。