2013-02-08 22 views
7

現在実行中のスレッドの終了コードを注入できる必要があります。私はしばらくの間、このいずれかで苦労している、と私は最終的にここに解決策を考え出した私がやっているものと同様のいくつかのコードです:スレッド終了コールバック

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(); 
} 

正常に動作するようですし、私が望んだまさに行い、私の唯一の関心事は、これは漏れや他の望ましくない副作用を引き起こす場合、私は見ていないかもしれないことです。

これは完全に問題ありませんが、これは非常に便利です。私は、既存のスレッドに終了コードを動的に追加できる単純なライブラリを見ることができました。

+1

よく見えます。コールバックは別のスレッドで実行されることに注意してください。 –

+1

コールバックを 'finally'ブロックに移動すると、' join'がターゲットスレッドが終了する*前に発生する例外をスローすると実行されます。また、一部の外部エージェントがすべてのスレッドを中断しない限り、joinは例外をスローしません。 –

+0

このメソッド内で作成した匿名スレッドが中断された場合、コールバックを呼び出す必要があるかどうかは非常に疑問です。スレッドを中断するポイントは、スレッドが何をしているのかを止めることです。このスレッドが実行している唯一のことは、コールバックを呼び出すのを待っているため、コールバックが実行されないようにすることができます。 –

答えて

3

あなたはより良いあなたはそれがとにかく

+1

良い点!私のスレッドがまだ病気で死んでいれば、やりたいことをやることができます。 –

+0

それは正確に注射ではありませんか?スレッド出口ロジックを組み込むようにスレッドコードを修正する必要があります。 (または、あなたは、OPの提案されたビヘイビアインジェクションスレッドを再構築することについて話していますか? –

+0

例外の場合にコールバックを移動する必要があると私は思っています。 –

0

を行いますAWTのイベントディスパッチスレッドのように、そのスレッドがアクティブに協調している場合を除き、スレッドを実行しているスレッドがあります。ルートにはRunnablesをキューから取り出して実行するループがあります。

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

最後に、設計は貴重なシステムリソース(スレッド)を無駄にし、別のスレッドが終了するのを待っています。

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

+0

一般的に言えば、スレッドを中断させる唯一の理由は、スレッドの処理をやめることだけです。この場合、コールバックを呼び出すのを待っているだけです。したがって、スレッドが中断されたときにコールバックが確実に呼び出されるようにする必要はありません。 –

+0

これは当然ですが、アプリケーションロジックに依存して、 'callback'が確実に呼び出されるかどうかを確認してください。たとえば、 'callback'が何らかのクリーニング作業をしている場合、スレッドが中断してもそれが呼び出されることを保証する正当な理由があります。 – iTech

2

と呼ばれていることを確認したい場合は、おそらくにコードを挿入することはできませんcatchブロックの後またはfinalブロックでcallback.run();を移動することができ

new Thread() { 
    @Override 
    public void run() { 
     try 
     { 
      // Thread logic here 
     } 
     finally 
     { 
      // Thread exit logic here 
     } 
    } 
}.start(); 
関連する問題