Java线程转储优先级值不为';与linux上的实际线程优先级不一致?
我打算在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
>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