我们有一个多线程应用程序在jdk 1.7中运行良好。在我们升级到Jdk 1.8之后,我们的一个线程停止了按预期工作。此帖子的调用方法位于此帖/问题的底部。
似乎线程保持在runnable状态,并且JVM没有选择它因某些原因而运行。但是,如果我们在下面的代码中取消注释“The Statement”,一切正常。我的假设是,如果没有这一行,JVM认为该线程没有做任何事情,因此不会选择该线程来运行。这是真的?除了放置虚拟代码以打印内容之外,我们还能做些什么来解决这个问题。
public String call() {
String result = "";
try {
while (!SomeClass.singleton.isDone()) {
//The Statement - Everything works if you uncomment below statement
//System.out.println("Status : " + elapsed);
elapsed = (System.currentTimeMillis() - startTime) / 60000;
// check the max job run time.
if (elapsed > SomeClassProperties.singleton().getMaxRunTime()) {
System.out.println("MaxRunTime exceeded. Killing job.");
SomeClass.singleton.killJob();
}
// don't log status until we've discovered the payload count
if (SomeClass.singleton.getPayloadsFound() < 1)
continue;
System.out.println("Status : " + elapsed);
logErrorMessages();
Thread.sleep(30000);
}
}
catch(Exception e){
//Do Something
}
}
答案 0 :(得分:0)
除非我错过了我的猜测,否则由于while条件为真,你的线程会进入一个沉重的非切换无限循环,并且#34之前的if条件继续&#34;保持虚假。
System.out隐式产生线程,因此你的其他线程有机会获得一些cpu时间。
因此,请尝试插入
Thread.yield()
或
Thread.sleep(someSmallTimeInterval)
在你的if-continue块中。