JDK 1.8

时间:2016-07-19 20:27:17

标签: multithreading java-8

我们有一个多线程应用程序在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
    }
}

1 个答案:

答案 0 :(得分:0)

除非我错过了我的猜测,否则由于while条件为真,你的线程会进入一个沉重的非切换无限循环,并且#34之前的if条件继续&#34;保持虚假。

System.out隐式产生线程,因此你的其他线程有机会获得一些cpu时间。

因此,请尝试插入

Thread.yield()

Thread.sleep(someSmallTimeInterval)
在你的if-continue块中