Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程是否根据其各自的优先级编号工作?_Java_Multithreading_Thread Priority - Fatal编程技术网

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是的,你说得对,我不想在我的评论中详述太多细节。