Webアプリであれば、リクエストならfilterで、セッションなら破棄された時に処理を行う。
そのような、ある意味AOPのAfterAdvice的なメカニズムを、バッチ処理などに織り込みたい場合等。
ThreadTestクラスを実行し、ThreadAクラスのスレッドを開始する。
ThreadAクラスは、親スレッドであるThreadTestクラスの処理の終了を待ち、ある処理を実行する。
public class ThreadTest { public static void main(String[] args) { new ThreadTest().testJoin(); } public void testJoin() { System.out.println("testJoin - 1"); // カレントのスレッドを渡して、ThreadAのスレッドを開始する new ThreadA(Thread.currentThread()).start(); try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("testJoin - 2"); } private class ThreadA extends Thread { Thread parent = null; protected ThreadA(Thread th) { this.parent = th; } public void run() { System.out.println("ThreadA - 1"); try { // 親スレッドの終了を待つ this.parent.join(); // スレッド終了時に行いたい処理 } catch (InterruptedException e) { } System.out.println("ThreadA - 2"); } } }
但し、Eclipse上からJUnitで確認すると、System.out.println("ThreadA - 2")が表示されない。
こちらの方が、ほぼ同等のコードを書いて投稿して下さってたので判明した。
http://www.javaroad.jp/bbs/answer.jsp?q_id=20081108004517591