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 setPriority()方法不使用';我不能正常工作_Java_Multithreading_Concurrency - Fatal编程技术网

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实现的

以下是一些选定的涉及线程优先级的Oracle参考:

  • -上面说:

    本机线程JVM上的Java线程可用的线程优先级应被视为调度程序的提示,特别是当线程是计算绑定的时。进程可用的处理器数量是动态的且不可预测。因此,尝试在任何多任务、多处理器系统上使用优先级来调度执行不太可能成功


除了这类材料,以及关于Java优先级如何映射到本机线程优先级的材料之外,Oracle文档对于Java SE的线程优先级以及它们的含义几乎没有提及。当然,没有人试图精确地指定行为


JavaRT(实时)是另一个问题,但它不再是Oracle支持的产品线。(好的)。

你发现的例子是错误的

  • 正如其他问题和评论所指出的,如果JVM可以使用多个内核,那么多个线程可以并行运行。当这种情况发生时,它将不仅仅是运行的最高优先级可运行线程

  • 除此之外,线程调度程序在优先级方面的行为取决于平台,这不仅是因为在许多平台上,线程调度是由操作系统而不是Java实现的

以下是一些选定的涉及线程优先级的Oracle参考:

  • -上面说:

    本机线程JVM上的Java线程可用的线程优先级应被视为调度程序的提示,特别是当线程是计算绑定的时。进程可用的处理器数量是动态的且不可预测。因此,尝试在任何多任务、多处理器系统上使用优先级来调度执行不太可能成功


除了这类材料,以及关于Java优先级如何映射到本机线程优先级的材料之外,Oracle文档对于Java SE的线程优先级以及它们的含义几乎没有提及。当然,没有人试图精确地指定行为


JavaRT(实时)是另一个问题,但它不再是Oracle支持的产品线。(好的)。

setPriority()工作正常,您正在观察a在打印每个线程的
toString()
方法时的效果。您有什么类型的CPU?多核?是的,它是多核的。
setPriority()
工作正常,您正在观察a在打印每个线程的
toString()
方法时的效果。您有什么类型的CPU?多核?是的,它是多核的。“Java优先级映射到本机线程优先级…”并且除非您的程序使用显式RTOS系统调用,否则线程“优先级”不是硬调度优先级。在大多数非实时操作系统中,“优先级”实际上意味着调度器偏差。调度器不断调整真正的优先级,以确保每个需要CPU时间的线程都能获得公平的CPU时间份额。调度程序偏差(也称为“优先级”,在Unix中称为“nice value”)允许您说该线程的公平份额大于或小于t