Java setPriority()方法不使用';我不能正常工作
我从中执行示例代码。我得到的结果是:Java setPriority()方法不使用';我不能正常工作,java,multithreading,concurrency,Java,Multithreading,Concurrency,我从中执行示例代码。我得到的结果是: Thread[Thread-3,1,main]: 5 Thread[Thread-0,10,main]: 5 Thread[Thread-2,1,main]: 5 Thread[Thread-1,1,main]: 5 Thread[Thread-4,1,main]: 5 Thread[Thread-0,10,main]: 4 Thread[Thread-3,1,main]: 4 Thread[Thread-2,1,main]: 4 Thread[Thread
Thread[Thread-3,1,main]: 5
Thread[Thread-0,10,main]: 5
Thread[Thread-2,1,main]: 5
Thread[Thread-1,1,main]: 5
Thread[Thread-4,1,main]: 5
Thread[Thread-0,10,main]: 4
Thread[Thread-3,1,main]: 4
Thread[Thread-2,1,main]: 4
Thread[Thread-0,10,main]: 3
Thread[Thread-5,1,main]: 5
Thread[Thread-3,1,main]: 3
Thread[Thread-2,1,main]: 3
Thread[Thread-1,1,main]: 4
Thread[Thread-5,1,main]: 4
Thread[Thread-3,1,main]: 2
Thread[Thread-2,1,main]: 2
Thread[Thread-5,1,main]: 3
Thread[Thread-3,1,main]: 1
Thread[Thread-4,1,main]: 4
Thread[Thread-0,10,main]: 2
Thread[Thread-2,1,main]: 1
Thread[Thread-5,1,main]: 2
Thread[Thread-4,1,main]: 3
Thread[Thread-5,1,main]: 1
Thread[Thread-1,1,main]: 3
Thread[Thread-0,10,main]: 1
Thread[Thread-4,1,main]: 2
Thread[Thread-1,1,main]: 2
Thread[Thread-4,1,main]: 1
Thread[Thread-1,1,main]: 1
似乎setPriority
无法正常工作。为什么?
如何修改示例代码以查看属性的效果。我假设您有一个多核CPU 线程优先级只影响线程调度,即当有多个线程等待执行时,它帮助系统决定下一步运行哪些线程 但在您的情况下,每个线程都被分配到不同的核心。没有等待线程,也不需要调度。所有六个线程实际上是并行运行的,线程优先级没有任何影响 如果希望看到线程优先级的效果,请稍微更改main方法,以创建足够的高优先级线程来占用所有CPU内核。然后,调度开始起作用,线程优先级起作用:
public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new SimplePriorities(Thread.MIN_PRIORITY);
// create enough high priority threads to occupy all CPU cores:
for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++)
new SimplePriorities(Thread.MAX_PRIORITY);
}
publicstaticvoidmain(字符串[]args){
对于(int i=0;i<5;i++)
新的简单优先级(Thread.MIN_优先级);
//创建足够的高优先级线程以占用所有CPU内核:
对于(int i=0;i
我假设您有一个多核CPU
线程优先级只影响线程调度,即当有多个线程等待执行时,它帮助系统决定下一步运行哪些线程
但在您的情况下,每个线程都被分配到不同的核心。没有等待线程,也不需要调度。所有六个线程实际上是并行运行的,线程优先级没有任何影响
如果希望看到线程优先级的效果,请稍微更改main方法,以创建足够的高优先级线程来占用所有CPU内核。然后,调度开始起作用,线程优先级起作用:
public static void main(String[] args) {
for (int i = 0; i < 5; i++)
new SimplePriorities(Thread.MIN_PRIORITY);
// create enough high priority threads to occupy all CPU cores:
for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++)
new SimplePriorities(Thread.MAX_PRIORITY);
}
publicstaticvoidmain(字符串[]args){
对于(int i=0;i<5;i++)
新的简单优先级(Thread.MIN_优先级);
//创建足够的高优先级线程以占用所有CPU内核:
对于(int i=0;i
您找到的示例已被破坏
- 正如其他问题和评论所指出的,如果JVM可以使用多个内核,那么多个线程可以并行运行。当这种情况发生时,它将不仅仅是运行的最高优先级可运行线程
- 除此之外,线程调度程序在优先级方面的行为取决于平台,这不仅是因为在许多平台上,线程调度是由操作系统而不是Java实现的
- -上面说: 本机线程JVM上的Java线程可用的线程优先级应被视为调度程序的提示,特别是当线程是计算绑定的时。进程可用的处理器数量是动态的且不可预测。因此,尝试在任何多任务、多处理器系统上使用优先级来调度执行不太可能成功
除了这类材料,以及关于Java优先级如何映射到本机线程优先级的材料之外,Oracle文档对于Java SE的线程优先级以及它们的含义几乎没有提及。当然,没有人试图精确地指定行为
JavaRT(实时)是另一个问题,但它不再是Oracle支持的产品线。(好的)。你发现的例子是错误的
- 正如其他问题和评论所指出的,如果JVM可以使用多个内核,那么多个线程可以并行运行。当这种情况发生时,它将不仅仅是运行的最高优先级可运行线程
- 除此之外,线程调度程序在优先级方面的行为取决于平台,这不仅是因为在许多平台上,线程调度是由操作系统而不是Java实现的
- -上面说: 本机线程JVM上的Java线程可用的线程优先级应被视为调度程序的提示,特别是当线程是计算绑定的时。进程可用的处理器数量是动态的且不可预测。因此,尝试在任何多任务、多处理器系统上使用优先级来调度执行不太可能成功
除了这类材料,以及关于Java优先级如何映射到本机线程优先级的材料之外,Oracle文档对于Java SE的线程优先级以及它们的含义几乎没有提及。当然,没有人试图精确地指定行为
JavaRT(实时)是另一个问题,但它不再是Oracle支持的产品线。(好的)。setPriority()工作正常,您正在观察a在打印每个线程的
toString()
方法时的效果。您有什么类型的CPU?多核?是的,它是多核的。setPriority()
工作正常,您正在观察a在打印每个线程的toString()
方法时的效果。您有什么类型的CPU?多核?是的,它是多核的。“Java优先级映射到本机线程优先级…”并且除非您的程序使用显式RTOS系统调用,否则线程“优先级”不是硬调度优先级。在大多数非实时操作系统中,“优先级”实际上意味着调度器偏差。调度器不断调整真正的优先级,以确保每个需要CPU时间的线程都能获得公平的CPU时间份额。调度程序偏差(也称为“优先级”,在Unix中称为“nice value”)允许您说该线程的公平份额大于或小于t