类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
子线程: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
答案 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);
}
}
}