2016-07-19 11 views
0

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 
    } 
} 
+0

どのような経過表示のような宣言ですか? AtomicLongにするとどうなりますか? –

+0

long elapsed = 0L; – Max08

+3

'SomeClass.singleton'は安全に公開されていますか?シングルトンのメソッドは適切に同期されていますか?そうでない場合、JITは予期せぬことをしている可能性があります。スレッドダンプは何を表示しますか?つまり、スレッドのスタックトレースは何ですか? –

答えて

0

私は私の推測を逃していない限り、あなたのスレッドが原因while条件が真であることに重い非スイッチング無限ループに入り、偽の滞在「継続」IF-条件の前に。

のSystem.outは、暗黙的にそのため、あなたの他のスレッドがいくつかのCPU時間を取得する機会を持って、スレッドを生成します。

したがって、あなたの場合は、引き続きブロックに

Thread.yield() 

または

Thread.sleep(someSmallTimeInterval) 

を挿入してみてください。

関連する問題