2010-07-23 165 views
4

如果我想让 设置一个优先级为最小值和最大值的线程,在Linux下使用线程创建Java应用程序?线程优先级

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

+0

[在Linux中的Java线程的优先级(http://stackoverflow.com/questions/128039) – krock 2010-07-23 12:18:32

回答

0

-20(最高)至+20(最低),默认为0。 但是,如果您不是root用户,则不能将nice值增加负值。 (例如,通过-7递增5的好值将被忽略,因为您通常没有获得这样的权限)。

EDIT看到https://stackoverflow.com/questions/128039/java-threads-priority-in-linux

+1

我认为你与混乱Linux的线程/进程优先级的可能重复Java线程优先。 Java允许您将Java线程优先级设置为从MIN_PRIORITY到MAX_PRIORITY的任何值。这些值如何映射到本地线程优先级是......在这里不相关。 – 2010-07-23 12:34:18

+0

值从-20(最高)到19(最低) – xdevel2000 2010-07-23 13:04:17

+0

@Stephen C在阅读更多的答案和评论后,他确实*想知道这些值是如何映射的(这是JVM特有的)。 (不,我没有混淆它 - Java *是独立于平台的,并且使用操作系统特定的参数是没有意义的。) – Tedil 2010-07-23 14:12:32

5

在Java它是从Thread.MIN_PRIORITY到Thread.MAX_PRIORITY没有定义的范围的,因为它依赖于底层操作系统和/或JVM上。

为了提高性能,如果您在不同优先级的线程之间共享资源,可能会遇到优先级反转问题。那就是当一个低优先级的线程持有一个具有高优先级线程的资源在等待它。那么高优先级的线程可能会等待很长时间。

+4

'MIN_PRIORITY'和'MAX_PRIORITY' [* do * have defined values](http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/constant-values.html#java.lang .Thread.MIN_PRIORITY)。他们分别是1和10。实现定义的事情是这些级别如何映射到实际的操作系统的prioerity水平! – 2010-07-23 13:07:43

+0

@JoachimSauer链接已损坏。 – 2015-02-15 21:12:58

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优先级的天然线程的优先级的映射依赖于(并且可以使用显式地设置)热点-XX Java选项。 (搜索页面的“优先级”。)

+0

我的问题是关于当我使用MAX_PRIORITY设置setPriority时由JVM映射的Linux系统上的值! – xdevel2000 2010-07-23 12:24:01

+0

@ xdevel2000 - 唯一100%可靠的答案是使用已安装的JVM **打印出这些常量**的值,并且不要假设它们在另一个JVM上是相同的。 – 2010-07-23 12:28:37

+0

@ xdevel2000:你的问题并没有真正解释你对从Java值到Linux内核值的映射感兴趣。也许你应该通过更新你的问题来扩展它。 – 2010-07-23 13:10:08

1

您是否尝试过使用常量从Thread.MIN_PRIORITYThread.MAX_PRIORITY来定义线程的优先级?

1

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

总之,你不应该编写你的程序来依赖线程优先级的行为。无论你想要做什么,最好以另一种方式完成。

0

使用setPriority,优先级级别从1(最不重要)到10(最重要)的范围,如果没有明确设置级别,默认情况下优先级为5。

还要检查常量MAX_PRIORITYMIN_PRIORITY