优先级较高的线程获得与较低优先级相同的CPU数量?

时间:2015-05-18 08:25:41

标签: java multithreading concurrency thread-priority

以下是我的代码。

public class Test {
    public static void main(String[] args) throws InterruptedException {
        PrintingThread a = new PrintingThread("A");
        a.setPriority(9);
        PrintingThread b = new PrintingThread("B");
        b.setPriority(1);
        a.start();
        b.start();
    }

    static class PrintingThread extends Thread {
        private int i = 0;
        private String name;

        public PrintingThread(String name) {
            super();
            this.name = name;
        }

        @Override
        public void run() {
            while (true) {
                i++;
                if (i % 100000 == 0) {
                    System.out.println("Thread " + name + " count=" + i
                            + ". Time :" + System.currentTimeMillis());
                }
            }

        }
    }
}

由于我已经为A设置了更高的优先级,我预计print语句会为A提供更高的值,但事实并非如此。以下是运行程序一段时间后的示例输出。

Thread A count=1033300000. Time :1431937330486
Thread A count=1033400000. Time :1431937330486
Thread A count=1033500000. Time :1431937330486
Thread A count=1033600000. Time :1431937330486
Thread B count=1058600000. Time :1431937330485
Thread B count=1058700000. Time :1431937330487

我在Ubuntu上运行Java版本1.7.0-79-b15。 我使用命令

运行程序
taskset 0x00000001 java -jar Untitled.jar

并且使用系统监视器UI验证只使用了一个CPU(如果我执行命令java -jar Untitled.jar使用了两个CPU)。

这是否意味着即使我设置了优先级也没有区别?或者我的程序有问题吗?

1 个答案:

答案 0 :(得分:6)

你的节目没问题。

设置线程的优先级只是对底层操作系统的提示(来自您的代码),要求尝试增加线程的优先级。根据您的电话,操作系统无法保证(甚至没有必要)。

如果此程序在不同情况下(CPU负载)或不同平台运行,则可以看到差异(但预期结果可能不是一致)。

注意:在Linux系统上,默认情况下,线程优先级不被视为。您必须使用XX:ThreadPriorityPolicy选项在Linux上启用线程优先级