2011-08-09 14 views
6

Javaでウォッチドッグを記述する必要があります。オブジェクトの初期化では問題ありません。クラスを作成しました。このクラスは、run()メソッドでリフレクションを使用してWatchDogとコンストラクタを呼び出します。Javaでメソッドを安全にする方法(オーバーフローなど)

スレッドは簡単に停止できますが、どのようにしてオブジェクトの通常のメソッドを保護できますか? たとえば、私はオブジェクトのメソッドを呼び出し、このメソッドは無限ループを実行します。どうすればよいでしょうか?

感謝オブジェクトの

+0

多分、アスペクトは行いますか? –

+0

「スレッドは簡単に止めることができます」、そうではありません。私は、「どのようにしてオブジェクトの通常のメソッドを確保できますか」という理解はしていませんが、エンドレスループに続く例もありません。 – toto2

+0

http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html これらのすべてを読んで、stop()を依然として呼び出すことを確認します。たぶんあなたの問題を回避するためには、諺のボックスの外のいくつかの考えが必要です。 – RichColours

答えて

3

通常の方法はいくつかスレッドで実行されています。それは、AWTイベントのディスパッチャーか、それが呼び出されたものであってもかまいません。あるいは、コンソールアプリケーションの主なスレッドかもしれません。

これらは、新しいThread()で呼び出されるスレッドと同じです。

あなたのウォッチドッグは、VM内のすべてのスレッドを調べ、使用率> =あるしきい値を持つものを探している必要があります。

これまでのコードはありますか?

リッチ

+0

オハイオ州、多分私はそれを間違って記述した、私はウォッチドッグに私が観察したいすべてのスレッドを与える。 私はオブジェクトを初期化し、スレッド内のすべてのメソッドを実行し、そのスレッドをウォッチドッグに渡したいだけです。 – Nicolas

+0

こんにちはNicolas これを詳しく調べることはできますか?具体的には、「オブジェクトを初期化してスレッド内のすべてのメソッドを実行し、そのスレッドをウォッチドッグに渡したいだけです」部。私はおそらく助けることができるが、私はあなたがしていることを理解していない。 – RichColours

+0

セキュリティで保護されたインスタンスと安全なメソッドを呼び出すためのコードは次のとおりです。 http://pastebin.com/v8kdvdUW 私は何をしたいのか理解できますように願っています。 – Nicolas

4

まず、私はスレッドを停止することはありません簡単であることを指摘すべきです。実際には、一般的なケースでは、スレッドが安全に停止することはできません。

  • 実際おろか、あなたが停止するスレッド上Thread.interrupt()を呼び出すことができますが、スレッドが割り込みを気づかれる保証はありませんやめる。

  • 廃止予定のThread.stop()メソッドを呼び出すことはできますが、このメソッドは安全ではありません。あなたが不幸な瞬間にそれを呼び出すと、データ構造を半分更新した状態にしておき、到着しないような信号に他のスレッドを待たせる(これまでどおり)ことができます。ここで


は、私はこの方法を実行するためのウォッチドッグを実装したい方法です。

まず、ウォッチドッグサービスに2つの呼び出しを追加する方法を変更します。例えば

public void someMethod(...) { 
    Watchdog.startMethod(maxTime); 
    // do stuff 
    Watchdog.endMethod(); 
} 

次に、私は有効期限に注文したプライオリティキューとウォッチドッグを実装したい:

  1. startMethod(maxTime)now + maxTimeの有効期限でキューにエントリを追加します。エントリーは、メソッドが呼び出されたとき(現在のスレッドへの参照が含まれるであろう。
  2. endMethod()は、現在のスレッドの()キューのエントリを探し、見つかった場合は、それを削除します。
  3. ウォッチドッグスレッドを定期的だろうそのエントリの有効期限が 'now'よりも短い場合、ウォッチドッグはエントリを削除し、スレッドを停止して次のエントリを確認します。次のエントリが期限切れになるまで繰り返します。

endMethod呼び出しがスキップされるケースを扱うために、データ構造にいくつかの考えを与える必要があります。 (メソッド呼び出しが例外のため終了することができますので、実際のところ、endMethod()コールは本当にfinallyブロック内で実行する必要があります。)

注意をstartMethodendMethod呼び出しは(そしておそらく必要があります)注釈によって挿入することができることプロセッサーなどのようなものです。


複雑さ、そしてあなたは(安全に)スレッドを停止することを保証できないという事実を考えると、私は方法ウォッチドッグを含まないいくつかの解決策を考えるだろう。

+0

これは問題を解決する正しい方法です。なぜそれが答えとして選ばれていないのか分かりません。もし誰かが箱の中で解決しようとするなら、@ yegor256が提示される@ Timeableを試してください。しかし、それは "介入後の清掃"の問題を解決しません。個人的に私はまだ自分の面を書くつもりです。 –

1

jcabi-aspectsから@Timeable注釈を使用してみてください:

public class Resource { 
    @Timeable(limit = 5, unit = TimeUnit.SECONDS) 
    public String load(URL url) { 
    return url.openConnection().getContent(); 
    } 
} 

あなたの方法は、タイムアウトで中断されます。

関連する問題