首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setPriority()方法不能正常工作

setPriority()方法不能正常工作
EN

Stack Overflow用户
提问于 2014-10-27 04:08:39
回答 2查看 2.5K关注 0票数 1

我从这里中做样例代码。我得到了结果:

代码语言:javascript
运行
复制
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似乎不能正常工作。为什么?

如何修改示例代码以查看属性的效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-27 10:59:22

你找到的例子坏了。

  • 正如其他问题和评论所指出的,如果JVM可以使用多个内核,那么多个线程可以并行运行。当这种情况发生时,它将不仅仅是运行的最高优先级的可运行线程。
  • 最重要的是,线程调度器对于优先级的行为取决于平台,尤其是在许多平台上,线程调度是由OS而不是Java实现的。

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

  • 推荐的编码实践:不依赖线程优先顺序
  • Java线程问题 -上面写着: 本机线程JVM上Java线程可用的线程优先级应该被视为调度程序的提示,特别是在线程是计算绑定的情况下。一个进程可用的处理器数量是动态的和不可预测的。因此,试图在任何多任务、多处理器系统上使用优先级来调度执行是不可能成功的。

除了这类材料,以及关于Java优先级如何映射到本地线程优先级的材料之外,Oracle文档对于Java的线程优先级以及它们的含义几乎保持沉默。当然,我们并没有试图精确地说明这种行为。

Java (实时)是一个不同的问题,但这不再是Oracle支持的产品线。(AFAIK)。

票数 6
EN

Stack Overflow用户

发布于 2014-10-27 09:26:13

我猜你有一个多核CPU。

线程优先级只影响线程调度,即帮助系统决定下一个线程在多个线程等待执行的情况下运行哪些线程。

但在您的情况下,每个线程被分配到不同的核心。没有等待线程,也不需要调度。所有六个线程实际上都是并行运行的,线程优先级没有任何影响。

如果要查看线程优先级的效果,请稍微更改主方法,以创建足够多的高优先级线程,以占用所有CPU核心。然后,调度启动,线程优先级起作用:

代码语言:javascript
运行
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26581057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档