1

私はこのように見えるいくつかのコードを持っています:

executorService.submit(new Runnable() {
    @Override public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            doWork();
        }
    }
});

このコードは、割り込みフラグが内部のどこかでクリアされているため、whileループを終了できない場合がありますdoWork()。このメソッドは、サードパーティのライブラリを呼び出します。そのうちの1つは、割り込みを飲み込んでいます。

まず、これを診断するために使用できる特定の手法はありますか?第二に、この種のバグを見つけることができる静的分析ツールはありますか?

4

1 に答える 1

3

これを診断するために使用できる特定の手法はありますか?

メソッドを拡張Threadおよびオーバーライドしてinterrupt()、独自の内部割り込みフラグを設定できます。次に、'doWork()`が終了した後、内部フラグをスレッドの状態と比較して、それらが異なるかどうかを確認できます。

いつでも自分でスレッドに割り込んで、が終了したときに割り込みフラグがクリアされるかどうかを確認できますdoWork();。これは明らかにあなたの論理を台無しにするでしょう。

この種のバグを見つけることができる静的分析ツールはありますか?

私が知っていることはありません。プロファイラーの1つは、スレッドの割り込みをキャッチするのに十分賢い可能性があります。

于 2013-01-29T23:01:59.117 に答える