質問

メインスレッドを新しいスレッドから生成させ、しばらくしてから割り込みフラグを立てようとしています。そうするとき、生成されたスレッドはそのフラグを確認し、それ自体を終了する必要があります。

メインスレッドは次のようになります。

final Thread t = new Thread()
{
    @Override
    public void run()
    {
        f();
    }
};
t.start();
try
{
    t.join(time);
    t.interrupt();
    if(t.isAlive())
    {
        t.join(allowance);
        if(t.isAlive())
            throw new Exception();
    }
}
catch(Exception e)
{
    System.err.println("f did not terminate in the alloted time");
}

そして、生成されたスレッドには、コード全体に次のようなコードが散在しています。

if(Thread.interrupted()) return;

デバッグ モードでは、すべてが完璧に動作します。割り込みフラグはメインスレッドによって生成され、生成されたスレッドによって捕捉されます。ただし、通常の実行モードでは、許容値をどれだけ長く設定しても、生成されたスレッドは割り込みフラグを受信しないようです。

私が何を間違っているか知っている人はいますか?

注記:私は Ubuntu を使用していますが、Linux についてはまったくの初心者です。OSに問題がある可能性はありますか?他の OS ではコードをテストしていません。

役に立ちましたか?

解決

私はあなたがこの種のものを行うために設計されており、他の方法であなたを助けることができるExecutorServiceの使用を検討してくださいお勧めします。

ExecutorService service = Executors.newCachedThreadPool();
Future<ResultType> future = service.submit(new Callable<ResultType() {
   public ResultType call() throws Exception {
      // do soemthing
      return (ResultType) ...;
   }
);
// do anything you like until you need to result.
try {
   ResultType result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException timedOut) {
  // handle exception
  // cancel the task, interrupting if still running.
  result.cancel(true);
} catch (ExecutionException taskThrewAnException) {
  // handle exception
}
// when you have finished with the service, which is reusable.
service.shutdown();

他のヒント

私の推測は次のとおりです。

  • メインスレッドが呼び出すとき t.interrupt(); t スレッドはすでに実行を終了しています。
  • メインスレッドが呼び出すとき t.interrupt(); t スレッドでは、チェックする呼び出しはもうありません interrupted() フラグ。
  • コードを実行した結果として例外が発生しましたか?「許容」時間の後にコードでスローした例外が発生しましたか、それとも他のような例外が発生しましたか ThreadInterruptedException または類似?キャッチした例外のメッセージを書いてみます...

あなたは)(Thread.interruptedのチェックを入れ子にしているのですか?その方法は、中断フラグをクリアするので、2回目の呼び出しはfalseを返します。代わりにisInterruptedを()を使用することができます。

Thread.interrupted()の呼び出しをfに到達していないかのように

に見えます()。

[デバッグと実行モードで見ている異なる挙動は、競合状態が原因である可能性が高い。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top