线程优先级水平

4

如果我想在Linux下使用线程制作Java应用程序,并设置优先级,最小值和最大值是多少?

在Windows中,范围从0(最低)到31(最高)。


可能是Java线程在Linux中的优先级的重复。 - krock
6个回答

5
在Java中,Thread.MIN_PRIORITY到Thread.MAX_PRIORITY之间没有定义的范围,因为它取决于底层操作系统和/或JVM。
在性能方面要注意,如果您在不同优先级的线程之间共享资源,则可能会遇到优先级反转问题。这是指低优先级线程持有高优先级线程正在等待的资源。然后高优先级线程可能会长时间等待。

4
MIN_PRIORITYMAX_PRIORITY已经有定义的值,分别为1和10。实现上需要注意的是这些级别与实际操作系统优先级级别之间的映射关系是由具体实现决定的! - Joachim Sauer
@JoachimSauer 链接已经失效。 - Quazi Irfan

3

Thread类有两个静态的int字段,分别为MIN_PRIORITYMAX_PRIORITY,它们的实际值为可能(如果不是)与平台相关110。理论上这些值在未来的Java版本中可能会发生变化,但这种情况极为罕见,因为这样的改变会破坏二进制兼容性。(原始常量的值可能会在编译时绑定到使用它的代码上)。无论如何,在(例如)setPriority方法的规范中都隐含着MIN_PRIORITY的值小于或等于MAX_PRIORITY的值。

编辑

啊...所以你真的想知道Java优先级值(例如Thread.MIN_PRIORITYThread.MAX_PRIORITY)如何映射到Linux本地线程优先级:

  • 优先级映射可能是特定于平台/JVM/版本的。Sun没有指定它们是什么。

  • 在纯Java应用程序中,您极有可能无法确定优先级映射。

  • 通过设置各种Java线程优先级并查看相应的Linux本机线程优先级,您可能会实验性地弄清楚映射关系。(可能有一些方法可以让 ps 命令打印出线程优先级。)

  • 或者,您可以下载并阅读OpenJDK源代码(针对您的版本/平台),以查看Java运行时实际执行的操作。

编辑2

实际上,根据this page,Java优先级到本机线程优先级的映射取决于(并且可以使用HotSpot -XX java选项进行显式设置)。(在页面中搜索"priority"。)


我的问题是关于在Linux系统上,当我使用MAX_PRIORITY设置优先级时,JVM映射的值是多少! - xdevel2000
@xdevel2000 - 唯一可靠的答案是使用您安装的JVM打印出这些常量的值...不要假设它们在另一个JVM上会是相同的。 - Stephen C
@xdevel2000:你的问题并没有真正说明你对Java值到Linux内核值的映射感兴趣。也许你应该通过更新你的问题来扩展它。 - Joachim Sauer

1
使用setPriority,优先级范围从1(最不重要)到10(最重要),如果没有明确设置级别,则默认优先级为5。
还要检查常量MAX_PRIORITYMIN_PRIORITY

1

你尝试过使用常量Thread.MIN_PRIORITYThread.MAX_PRIORITY来定义线程的优先级吗?


1
值得注意的是,线程优先级只是一个提示,在Linux上很大程度上被忽略,除非您是root用户,并且在Windows上只能降低优先级。
简而言之,您不应该编写程序依赖于线程优先级的行为。无论您想做什么,最好用另一种方式实现。

0

1
我认为你将Linux线程/进程优先级与Java线程优先级混淆了。Java允许您将Java线程优先级设置为从MIN_PRIORITY到MAX_PRIORITY的任何值。这些值如何映射到本地线程优先级在这里不是相关的。 - Stephen C
数值从-20(最高)到19(最低)。 - xdevel2000
@Stephen C 嗯,阅读更多的答案和评论后,他实际上确实想知道这些值是如何映射的(这是JVM特定的)。 (不,我没有混淆 - Java 跨平台的,使用特定于操作系统的参数是没有意义的。) - Tedil
是的,事实证明他对映射很感兴趣。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接