S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

スレッドが終了したことを検知して処理を行う

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