Java 线程是否根据其各自的优先级编号工作?
为什么编译器会先打印Java 线程是否根据其各自的优先级编号工作?,java,multithreading,thread-priority,Java,Multithreading,Thread Priority,为什么编译器会先打印2a,然后再打印2b,或者在赋予线程a以启动优先级时反过来打印?线程b是否应该等待线程a完成以启动?有人能解释一下它是怎么工作的吗 public class Test1 extends Thread{ static int x = 0; String name; Test1(String n) { name = n; } public void increment() { x = x+1;
2a
,然后再打印2b
,或者在赋予线程
a以启动优先级时反过来打印?线程b
是否应该等待线程a
完成以启动?有人能解释一下它是怎么工作的吗
public class Test1 extends Thread{
static int x = 0;
String name;
Test1(String n) {
name = n;
}
public void increment() {
x = x+1;
System.out.println(x + " " + name);
}
public void run() {
this.increment();
}
}
public class Main {
public static void main(String args[]) {
Test1 a = new Test1("a");
Test1 b = new Test1("b");
a.setPriority(3);
b.setPriority(2);
a.start();
b.start();
}
}
线程b不应该等待线程a完成后再开始吗
否。优先级不会阻止线程执行。它只告诉JVM执行线程。这确实意味着等待
因为您的代码非常简单,所以没有什么可等待的。两个线程中的任何一个都会运行。赋予优先级不是编译器的工作。它是OS调度程序,用于调度线程并为其分配CPU时间(称为量子) 调度程序还会根据可用的CPU数量,尝试一次运行尽可能多的线程。在当今的多核系统中,通常有多个核可用 如果希望线程等待另一个线程,请使用某种同步机制 为什么编译器会先打印2A,然后打印2B 祝你抽签成功。“优先级”在不同的操作系统上意味着不同的事情,但一般来说,当没有足够的CPU同时运行它们时,操作系统总是决定哪个线程运行,哪个线程必须等待。若你们的计算机在启动那个程序时有两个或两个以上的空闲CPU,那个么每个人都可以运行。优先级在这种情况下并不重要,它只是一场比赛,看谁先到达
println(…)
调用
示例中的
a
线程有一个优势,因为程序在a.start()
方法返回后才调用b.start()
,但该优势实际有多大取决于操作系统线程调度算法的细节。a
线程可能会有一个巨大的开头(比如,它实际上在b
甚至开始之前就完成了),或者它可能是一个几乎微不足道的开头。那么优先级的重要性是什么呢?@HusseinJaber优先级较高的线程会被CPU调度程序优先考虑;因此,在争用的情况下,通常会运行优先级较高的线程,而不是优先级较低的线程。@markrottveel,这通常是正确的。但事实是,线程优先级在Java中毫无意义。它只是一个数字——一个提示——传递给操作系统。大多数桌面、移动设备和服务器操作系统都将优先级视为权重:当两个线程都需要100%的可用CPU时,它们会允许低优先级线程抢占高优先级线程,但平均而言,它们会将更大的CPU份额分配给高优先级线程。另一方面,实时操作系统可能永远不会允许低优先级线程抢占高优先级线程。@SolomonSlow是的,你说得对,我不想在我的评论中详述太多细节。