jdk 1.7でうまく動作していたマルチスレッドアプリケーションがあります。 Jdk 1.8にアップグレードした後、私たちのスレッドのうちの1つが期待どおりに動作しなくなりました。このスレッドの呼び出しメソッドは、この投稿/質問の一番下にあります。JDK 1.8のスレッド
スレッドが実行可能状態になったままで、何らかの理由で実行する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
}
}
どのような経過表示のような宣言ですか? AtomicLongにするとどうなりますか? –
long elapsed = 0L; – Max08
'SomeClass.singleton'は安全に公開されていますか?シングルトンのメソッドは適切に同期されていますか?そうでない場合、JITは予期せぬことをしている可能性があります。スレッドダンプは何を表示しますか?つまり、スレッドのスタックトレースは何ですか? –