Java 线程优先级

Java 线程优先级,java,multithreading,Java,Multithreading,如果我愿意的话,在Linux下用Java开发一个带线程的应用程序 设置一个最小值和最大值的优先级 在Windows中,范围从0(最低)到31(最高)。-20(最高)到+20(最低),默认为0。 但是,如果不是root,就不能将nice值增加负值。 (例如,将一个很好的值5乘以-7将被忽略,因为您通常没有这样做的权限) 编辑请参见Java中的Thread.MIN_PRIORITY to Thread.MAX_PRIORITY没有定义的范围,因为它取决于底层操作系统和/或JVM 为了提高性能,如果在

如果我愿意的话,在Linux下用Java开发一个带线程的应用程序 设置一个最小值和最大值的优先级

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

-20(最高)到+20(最低),默认为0。 但是,如果不是root,就不能将nice值增加负值。 (例如,将一个很好的值5乘以-7将被忽略,因为您通常没有这样做的权限)


编辑请参见Java中的Thread.MIN_PRIORITY to Thread.MAX_PRIORITY没有定义的范围,因为它取决于底层操作系统和/或JVM


为了提高性能,如果在不同优先级的线程之间共享资源,可能会遇到优先级反转问题。也就是说,低优先级线程持有一个资源,而高优先级线程在等待该资源。然后高优先级线程可能会等待很长时间。

该类有两个静态
int
字段,分别称为
MIN\u priority
MAX\u priority
,其实际值可能(如果不是实际值)特定于平台
1
10
。从理论上讲,这些值可能在将来的Java版本中发生更改。然而,这是极不可能的,尤其是因为这样的更改将破坏二进制兼容性。(原语常量的值可能会绑定到编译时使用它的代码。)无论是哪种方式,在
setPriority
方法的规范中(例如)都隐含着MIN_PRIORITY的值将小于或等于MAX_PRIORITY的值

编辑

啊。。。因此,您确实想知道Java优先级值(例如
Thread.MIN\u priority
Thread.MAX\u priority
)如何映射到Linux本机线程优先级:

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

  • 在纯Java应用程序中很难确定优先级映射

  • 通过设置各种Java线程优先级并查看相应的Linux本机线程优先级,您可以从实验上找出映射。(可能有某种方法可以让
    ps
    命令打印线程优先级。)

  • 或者,您可以下载并阅读OpenJDK源代码(针对您的版本/平台),以了解Java运行时的实际功能

编辑2


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

您是否尝试使用常量Thread.MIN\u priorityThread.MAX\u priority来定义线程的优先级?

值得注意的是,线程优先级只是一个提示,在Linux上基本上被忽略,除非您是root用户,并且只能在windows上降低优先级

简而言之,编写程序时不应该依赖线程优先级的行为。无论你想做什么,最好用另一种方式来做。

使用,优先级范围从1(最不重要)到10(最重要),如果没有明确设置优先级,则默认优先级为5


还要检查常量,

我的问题的可能重复之处在于,当我使用MAX_PRIORITY设置优先级时,JVM映射到Linux系统上的值@xdevel2000-唯一100%可靠的答案是使用安装的JVM打印这些常量的值。。。不要假设它们在另一个JVM上是相同的。@xdevel2000:你的问题并不能真正解释你对Java值到Linux内核值的映射感兴趣。也许你应该通过更新你的问题来扩展这一点,我认为你把Linux线程/进程优先级和Java线程优先级混淆了。Java允许您将Java线程优先级设置为从最小优先级到最大优先级的任意值。如何将这些值映射到本机线程优先级是。。。这里不相关。值从-20(最高)到19(最低)@Stephen C嗯,在阅读了更多的答案和评论之后,他确实想知道这些值是如何映射的(这是JVM特有的)。(不,我没有混淆——Java是独立于平台的,使用操作系统特定的参数是没有意义的。)是的,事实证明他对映射感兴趣。
MIN\u PRIORITY
MAX\u PRIORITY
。它们分别是1和10。实现定义的问题是这些级别如何映射到实际的操作系统优先级级别@JoachimSauer链接已断开。