まず、私はスレッドを停止することはありません簡単であることを指摘すべきです。実際には、一般的なケースでは、スレッドが安全に停止することはできません。
実際おろか、あなたが停止するスレッド上Thread.interrupt()
を呼び出すことができますが、スレッドが割り込みを気づかれる保証はありませんやめる。
廃止予定のThread.stop()
メソッドを呼び出すことはできますが、このメソッドは安全ではありません。あなたが不幸な瞬間にそれを呼び出すと、データ構造を半分更新した状態にしておき、到着しないような信号に他のスレッドを待たせる(これまでどおり)ことができます。ここで
は、私はこの方法を実行するためのウォッチドッグを実装したい方法です。
まず、ウォッチドッグサービスに2つの呼び出しを追加する方法を変更します。例えば
public void someMethod(...) {
Watchdog.startMethod(maxTime);
// do stuff
Watchdog.endMethod();
}
次に、私は有効期限に注文したプライオリティキューとウォッチドッグを実装したい:
startMethod(maxTime)
はnow + maxTime
の有効期限でキューにエントリを追加します。エントリーは、メソッドが呼び出されたとき(現在のスレッドへの参照が含まれるであろう。
endMethod()
は、現在のスレッドの()キューのエントリを探し、見つかった場合は、それを削除します。
- ウォッチドッグスレッドを定期的だろうそのエントリの有効期限が 'now'よりも短い場合、ウォッチドッグはエントリを削除し、スレッドを停止して次のエントリを確認します。次のエントリが期限切れになるまで繰り返します。
endMethod
呼び出しがスキップされるケースを扱うために、データ構造にいくつかの考えを与える必要があります。 (メソッド呼び出しが例外のため終了することができますので、実際のところ、endMethod()
コールは本当にfinally
ブロック内で実行する必要があります。)
注意をstartMethod
とendMethod
呼び出しは(そしておそらく必要があります)注釈によって挿入することができることプロセッサーなどのようなものです。
複雑さ、そしてあなたは(安全に)スレッドを停止することを保証できないという事実を考えると、私は方法ウォッチドッグを含まないいくつかの解決策を考えるだろう。
多分、アスペクトは行いますか? –
「スレッドは簡単に止めることができます」、そうではありません。私は、「どのようにしてオブジェクトの通常のメソッドを確保できますか」という理解はしていませんが、エンドレスループに続く例もありません。 – toto2
http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html これらのすべてを読んで、stop()を依然として呼び出すことを確認します。たぶんあなたの問題を回避するためには、諺のボックスの外のいくつかの考えが必要です。 – RichColours