8

現在実行中のスレッドに終了コードを挿入できるようにする必要があります。私はしばらくこれに苦労してきましたが、最終的に解決策を思いつきました。これは、私がやっていることと似たコードです:

public static void injectThreadExitCallback(final Runnable callback) {
    final curr = Thread.currentThread();
    new Thread() {
        @Override
        public void run() {
            try {
                curr.join();
                callback.run();
            } catch (InterruptedException ex) {
                ... logging ...
            }
        }
    }.start();
}

それはうまく機能しているようで、私が望んでいることを正確に実行します。私の唯一の懸念は、これが漏れやその他の望ましくない副作用を引き起こすかどうかです。

または、これはまったく問題ありません。そうであれば、これは非常に便利です。既存のスレッドに終了コードを動的に追加できる単純なライブラリを確認できました。

4

3 に答える 3

5

やったほうがいい

new Thread () {
    @Override
    public void run () {
        try
        {
            // Thread logic here
        }
        finally
        {
            // Thread exit logic here
        }
    }
}.start ();
于 2013-02-08T20:12:23.933 に答える
3

たとえば、AWTのイベントディスパッチスレッドのように、実行中のスレッドにコードを挿入することはできません。このスレッドのルートには、Runnablesをキューから取り出して実行するループがあります。

デザインによって、以前はシングルスレッドであったため、同時実行性の問題がなかったコードにデータ競合が発生する可能性があります。

最後に、設計は貴重なシステムリソース(スレッド)を浪費して、別のスレッドが終了するのを待つだけです。

外部から既存のコードにパッチを適用するためにこれが必要な場合は、それが唯一のオプションである可能性があります。そうでない場合は、より効率的な明示的なメカニズムを提供する方がよいでしょう。

于 2013-02-08T20:29:03.903 に答える
0

とにかく呼び出されるようにしたい場合はcallback.run();、ブロックの後catchまたはブロック内に移動できますfinal

于 2013-02-08T20:14:24.737 に答える