質問
メインスレッドを新しいスレッドから生成させ、しばらくしてから割り込みフラグを立てようとしています。そうするとき、生成されたスレッドはそのフラグを確認し、それ自体を終了する必要があります。
メインスレッドは次のようになります。
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に到達していないかのように
に見えます()。
[デバッグと実行モードで見ている異なる挙動は、競合状態が原因である可能性が高い。
所属していません StackOverflow