Java线程转储prio值不符合Linux上真正的线程优先级?

Java线程转储prio值不符合Linux上真正的线程优先级?,第1张

概述Java线程转储prio值不符合Linux上真正的线程优先级

我打算在我的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)

在Web上读完一些内容后,我现在用下面的命令启动我的testing应用程序:

sudo java -XX:+UseThreadPrioritIEs -XX:ThreadPriorityPolicy=1 -jar ThreadPriorityTest.jar

testing应用程序由以下两个类组成:

package ch.mypackage; public class CountingRunnable implements Runnable{ private long count=0; private boolean goOn=true; public long getCount() { return count; } public voID stop(){ goOn=false; } public voID run() { for(long iteration=0;goOn&&iteration<Long.MAX_VALUE;++iteration){ ++count; } } } package ch.mypackage; public class PriorizedCountingThreads { private static final int NUM_MILliS_TO_COUNT_FOR = 1*60*1000; private static CountingRunnable[] runnables; private static Thread[] threads; /** * @param args */ public static voID main(String[] args) { Thread.currentThread().setPriority(Thread.MAX_PRIORITY); System.out.println("MIN_PRIORITY: "+Thread.MIN_PRIORITY); System.out.println("MAX_PRIORITY: "+Thread.MAX_PRIORITY); int numPriorityLevels=(Thread.MAX_PRIORITY-Thread.MIN_PRIORITY)+1; init(numPriorityLevels); startThreads(); try { Thread.sleep(NUM_MILliS_TO_COUNT_FOR); } catch (InterruptedException e) { e.printstacktrace(); } stopRunnables(); printCounts(); } private static voID printCounts() { for(int i=0;i<runnables.length;++i){ System.out.println(threads[i].getname()+" has priority: "+threads[i].getPriority()+" and count:"+runnables[i].getCount()); } } private static voID stopRunnables() { for(int i=0;i<runnables.length;++i){ runnables[i].stop(); } } private static voID startThreads() { for(int i=0;i<threads.length;++i){ threads[i].start(); } } private static voID init(int numPriorityLevels) { runnables=new CountingRunnable[numPriorityLevels]; threads=new Thread[runnables.length]; for(int i=0;i<runnables.length;++i){ int priority=i+1; runnables[i]=new CountingRunnable(); threads[i]=new Thread(runnables[i]); threads[i].setPriority(priority); threads[i].setname("PriorityThread_"+priority); } } }

如果我让程序计数一分钟(NUM_MILliS_TO_COUNT_FOR = 1 * 60 * 1000),那么我得到以下输出:

在windows 10上安装TiZen将无法识别安装的JDK 9

如何同时运行java 6和java 7

Java陷入无限循环,在windows Server 2003上执行wmic命令

无法从java进程使用taskkill.exe

SWT ExpandListener在linux上发生崩溃之前执行

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

根据这个输出的优先事项似乎有预期的影响! 但是,如果我使用“Jstack”或“kill -s QUIT”生成线程转储,那么我得到以下输出,这意味着每个线程都具有相同的优先级(prio = 10):

"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)

如果我在windows机器上执行相同的 *** 作,则根据我在此处find的优先级映射,prio值是正确的。

那么,这是一个错误的Jstack,或者我做错了什么?

如果我执行“顶部| grep java”我得到以下内容:

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

这意味着主线程的优先级为20,而“top -H | grep 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

这表明java线程的优先级真的影响了OS线程的优先级。

但是Jsack在prio = 10中的值是从哪里来的呢? 它只是一个任意值?

显示UTC而不是EST的本地显示EST的linux服务器

Apache CXF wsdl2java:使服务返回原始的WSDL文件

linux上的Java剪贴板(仅限文本),一些程序可以读取,其他程序不能,为什么

告诉Java应用程序是否以nt权限/系统特权运行

命令行工具将jar转换为可执行文件?

在Java中的线程优先级是一个非常非常敏感的主题…你可以在这里找到一个在StackOverlow上的帖子: https ://stackoverflow.com/a/2170304/1343096

基本上试图改变你的优先级策略为42:

-XX:ThreadPriorityPolicy=42

让我们知道如果它为你做的伎俩!

你可以通过下面的链接找到所有的解释。

Java 7文档状态

注 – 此实用程序不受支持,可能会或可能不会在将来版本的JDK中使用。

所以我会假设Jstack的输出可能不准确,因为在linux上的实现细节可能已经改变。

由htop -H报告的值与本文中的内容一致 ,包含在你的问题中,并且是java进程在linux内核中的依赖关系。

如果您需要将Jstack的输出映射到由top -H报告的线程,则只需将nID从nID转换为十进制或从top -H为十六进制的pID即可。 看到这篇文章

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

如果你知道一切都已经完成了(就像从main调用printCounts()之后)不要犹豫,使用System.exit(0); 从而确保所有线程都被终止。

如果要在并行执行期间测试代码的行为,通常先创建所有Thread并让它们同步工作。 在一个共享的CountDownLatch或者CyclicbarrIEr上调用await()作为worker的第一条语句通常可以做到这一点。

虽然按照Java教程 , boolean读写是原子的,但我建议像goOn字段一样声明触发器变量,因为这也会影响编译器如何优化代码。

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

总结

以上是内存溢出为你收集整理的Java线程转储prio值不符合Linux上真正的线程优先级?全部内容,希望文章能够帮你解决Java线程转储prio值不符合Linux上真正的线程优先级?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1157557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存