2

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

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

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 でコードをテストしていません。

4

4 に答える 4

4

ここに私の推測があります:

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

f() で Thread.interrupted() 呼び出しに到達していないようです。

デバッグ モードと実行モードで見られる異なる動作は、競合状態が原因である可能性があります。

于 2009-05-16T08:25:27.390 に答える
0

Thread.interrupted() のネストされたチェックがありますか? そのメソッドは中断フラグをクリアするため、2 番目の呼び出しは false を返します。代わりに isInterrupted() を使用できます。

于 2009-05-16T08:58:38.980 に答える
0

この種のことを行うように設計されており、他の方法で役立つ可能性がある 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();
于 2009-05-16T19:25:58.737 に答える