为什么在此示例中具有较高优先级的线程之后没有执行优先级较低的线程?

时间:2017-06-15 06:13:32

标签: java multithreading thread-priority

类MyThread扩展了线程{

public void run() {

    for (int i = 0; i < 10; i++) {
        System.out.println("Child Thread:" + i);
    }
}

}

public class ThreadPriorityProperDemo {

public static void main(String[] args) {
    MyThread t=new MyThread();
    t.setPriority(10);
    System.out.println("Main Priority:"+Thread.currentThread().getPriority());
    System.out.println("Child Priority:"+t.getPriority());
    System.out.println("-----------------------------------");
    t.start();
    for (int i = 0; i < 10; i++) {
        System.out.println("Parent Thread:" + i);
    }

}

}

理想的输出应该是:

主要优先级:5

儿童优先:10

子线程:0

Child Thread:1

Child Thread:2

Child Thread:3

Child Thread:4

Child Thread:5

Child Thread:6

Child Thread:7

Child Thread:8

Child Thread:9

父线程:0

父线程:1

父线程:2

父线程:3

父线程:4

父线程:5

父线程:6

父线程:7

父线程:8

父线程:9

但我的输出混合了..为什么?我在Ububtu 16.04 LTS

3 个答案:

答案 0 :(得分:2)

Oracle documentation中有一个答案元素。

  

JVM为Java线程定义了十个逻辑优先级,   包括:

     

java.lang.Thread.MIN_PRIORITY = 1

     

java.lang.Thread.NORM_PRIORITY = 5

     

java.lang.Thread.MAX_PRIORITY = 10

     

...

     

JVM可以以任何方式自由实施优先级,包括忽略该值。

此外,即使JVM完全遵循优先级,多核CPU也可以并行运行两个线程 仅当活动线程数超过CPU可同时运行的进程数时(对于超线程CPU = Core * Core的线程数),优先级才可见。

最后,设置短任务的优先级或设置可能不会真正应用的优先级,因为之前解释的条件不正确(并发线程少于CPU能够处理的线程)会对申请表现:

  

调用Thread.setPriority方法可能是一项昂贵的操作。   轻微的优先级调整可能会降低性能。

答案 1 :(得分:0)

另外,请记住,您的计算机很可能有多个内核,因此它会同时执行多个线程。 执行以下代码:

int cores = Runtime.getRuntime().availableProcessors();

在我的电脑中,我获得了8个核心。因此Java可以同时执行多达8个线程。 如果要执行具有不同优先级的任务,一个好方法是使用两个不同的线程池。例如:

ExecutorService executorLowPriority = Executors.newFixedThreadPool(2);
ExecutorService executorHighPriority = Executors.newFixedThreadPool(6);

答案 2 :(得分:0)

这是参考OCA / OCP JAVA SE 7程序员I&amp; II Kathy Sierra和Bert Bates的学习指南。

  

setPriority()方法用于Thread对象以提供线程   优先级介于1(低)和10(高)之间,但优先级不是   保证,并非所有JVM都识别10个不同的优先级 - 一些   水平可以被视为有效平等。

此外,

  

在大多数情况下,正在运行的线程将具有与之相同或更高的优先级   池中的最高优先级线程。这几乎是关于调度的保证   您将从JVM规范中获取,因此您绝不能依赖于线程优先级   保证程序的正确行为。

最后一个:

  

在设计多线程应用程序时,不要依赖线程优先级。   因为无法保证线程调度优先级行为......

如果您只想获得所需的输出,可以尝试使用JOIN():

public class ThreadPriorityProperDemo {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.setPriority(10);
        System.out.println("Main Priority:" + Thread.currentThread().getPriority());
        System.out.println("Child Priority:" + t.getPriority());
        System.out.println("-----------------------------------");
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 0; i < 10; i++) {
            System.out.println("Parent Thread:" + i);
        }

    }
}