Java线程转储优先级值不为';与linux上的实际线程优先级不一致?

Java线程转储优先级值不为';与linux上的实际线程优先级不一致?,java,linux,multithreading,pthreads,jstack,Java,Linux,Multithreading,Pthreads,Jstack,我打算在Java代码中使用线程优先级。 应用程序应在我的Linux系统上运行: >uname -a Linux <host> 3.0.0-15-generic #26-Ubuntu SMP <date> x86_64 x86_64 x86_64 GNU/Linux >java -version java version "1.6.0_23" OpenJDK Runtime Environment (IcedTea6 1.11pre) (6

我打算在Java代码中使用线程优先级。 应用程序应在我的Linux系统上运行:

>uname -a
Linux <host> 3.0.0-15-generic #26-Ubuntu SMP <date> x86_64 x86_64 x86_64 GNU/Linux

>java -version
java version "1.6.0_23"
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.1)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
测试应用程序由以下两类组成:

package ch.mypackage;
公共类CountingRunnable实现Runnable{
私有长计数=0;
私有布尔goOn=true;
公共长getCount(){
返回计数;
}
公共停车场(){
傻瓜=假;
}
公开募捐{

对于(long iteration=0;goOn&&iteration来说,Java中的线程优先级是一个非常敏感的主题。。。 您可以在下面的StackOverlow上找到一个有趣的帖子:

基本上,尝试将您的优先级策略更改为42:

-XX:ThreadPriorityPolicy=42
让我们知道它是否对你有用

您可以通过以下链接找到所有解释。

状态

注意-此实用程序不受支持,可能在未来版本的JDK中可用,也可能不可用

因此,我假设
jstack
的输出可能不准确,因为linux上的实现细节可能已经改变

htop-H
报告的值与您在问题中包含的值一致,并且是在linux内核中调度java进程的值

如果需要将jstack的输出映射到由
top-H
报告的线程,则只需将
nid
jstack
转换为十进制,或将
pid
top-H
转换为十六进制

关于您的源代码:程序在我运行时不会终止。编写生产多任务代码时有三个提示:

  • 如果您知道一切都已完成(如从
    main
    调用
    printCounts()
    ),请毫不犹豫地使用
    System.exit(0);
    ther确保终止所有线程
  • 如果您想在并行执行期间测试代码的行为,通常最好先创建所有
    线程
    s,并让它们同步工作。在工作者的共享或作为第一个语句上调用
    wait()
    ,通常可以很好地完成这一任务
  • 虽然
    boolean
    读写是原子的,但我建议将触发器变量(如
    goOn
    字段)声明为volatile,因为这也会影响编译器优化代码的方式

使用
volatile
System.exit(0)
您的基准测试正常终止。

请注意,Java线程不一定对应于系统进程/线程(例如,可能是在内部执行调度的单进程JVM)因此,Java的线程优先级不一定与OS线程优先级相匹配。无论Java线程是否与OS线程相对应,Java优先级都没有指定为在数字上等于OS级别。@Thomas AFAIK,openJDK根本不使用绿色线程,无论平台如何。另请参阅
MIN_PRIORITY: 1
MAX_PRIORITY: 10
PriorityThread_1 has priority: 1 and count:12658044343
PriorityThread_2 has priority: 2 and count:19008431582
PriorityThread_3 has priority: 3 and count:30618946099
PriorityThread_4 has priority: 4 and count:34408365142
PriorityThread_5 has priority: 5 and count:36694025023
PriorityThread_6 has priority: 6 and count:40493710165
PriorityThread_7 has priority: 7 and count:42826305342
PriorityThread_8 has priority: 8 and count:42203891414
PriorityThread_9 has priority: 9 and count:43128747383
PriorityThread_10 has priority: 10 and count:43416371500
    "PriorityThread_10" prio=10 tid=0x00007ff7e406f800 nid=0x12e6 runnable [0x00007ff7e2562000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_9" prio=10 tid=0x00007ff7e406d800 nid=0x12e5 runnable [0x00007ff7e2663000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_8" prio=10 tid=0x00007ff7e406b000 nid=0x12e4 runnable [0x00007ff7e2764000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_7" prio=10 tid=0x00007ff7e4069000 nid=0x12e3 runnable [0x00007ff7e2865000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_6" prio=10 tid=0x00007ff7e4067000 nid=0x12e2 runnable [0x00007ff7e2966000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_5" prio=10 tid=0x00007ff7e4065000 nid=0x12e1 runnable [0x00007ff7e2a67000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_4" prio=10 tid=0x00007ff7e4063000 nid=0x12e0 runnable [0x00007ff7e2b68000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_3" prio=10 tid=0x00007ff7e4061000 nid=0x12df runnable [0x00007ff7e2c69000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_2" prio=10 tid=0x00007ff7e405d000 nid=0x12de runnable [0x00007ff7e2d6a000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)

"PriorityThread_1" prio=10 tid=0x00007ff7e4049800 nid=0x12dd runnable [0x00007ff7e2e6b000]
   java.lang.Thread.State: RUNNABLE
    at ch.mypackage.CountingRunnable.run(CountingRunnable.java:17)
    at java.lang.Thread.run(Thread.java:679)
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3394 root      20   0 4444m  15m 8376 S  789  0.1   0:47.52 java 
 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND     

 3457 root      15  -5 4444m  15m 8384 R   99  0.1   0:08.60 java
 3456 root      16  -4 4444m  15m 8384 R   97  0.1   0:08.41 java
 3455 root      17  -3 4444m  15m 8384 R   93  0.1   0:08.42 java
 3454 root      18  -2 4444m  15m 8384 R   97  0.1   0:08.27 java
 3453 root      19  -1 4444m  15m 8384 R   97  0.1   0:07.50 java
 3452 root      20   0 4444m  15m 8384 R   51  0.1   0:07.44 java
 3451 root      21   1 4444m  15m 8384 R   35  0.1   0:04.83 java
 3450 root      22   2 4444m  15m 8384 R   99  0.1   0:04.78 java
 3449 root      23   3 4444m  15m 8384 R   95  0.1   0:07.47 java
 3448 root      24   4 4444m  15m 8384 R   18  0.1   0:02.85 java
-XX:ThreadPriorityPolicy=42