結城浩のはてなブログ

ふと思いついたことをパタパタと書いてます。

Javaのjoinメソッド

joinメソッドの動きがよくわからない。。。という記事を見かけて、久しぶりにJavaでプログラムを書きました。
joinメソッドは、th.join();という文を実行したとき、その文を実行したスレッドAは、thというインスタンスが管理しているスレッドBが終了するのを待つ、ということですね。
以下、それほどわかりやすくはないですが、簡単なプログラム。

class Main {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread() + ": Start. (A)");
        try {
            Thread th = new Thread() {
                public void run() {
                    try {
                        System.out.println(Thread.currentThread() + ": Start. (B)");
                        for (int i = 0; i < 3; i++) {
                            System.out.println(this + ": i = " + i);
                            Thread.sleep(1000);
                        }
                        System.out.println(Thread.currentThread() + ": End. (B)");
                    } catch (InterruptedException e) {
                        System.out.println(e);
                    }
                }
            };
            th.start();
            th.join();
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        System.out.println(Thread.currentThread() + ": End. (A)");
    }
}

th.start();やth.join();を呼び出しているのがスレッドA(mainスレッド)で、runメソッドの本体を実行しているのはスレッドB(Thread-0スレッド)ですね。
コンパイルと実行結果です。

C:\work> javac Main.java
C:\work> java Main
Thread[main,5,main]: Start. (A)
Thread[Thread-0,5,main]: Start. (B)
Thread[Thread-0,5,main]: i = 0
Thread[Thread-0,5,main]: i = 1
Thread[Thread-0,5,main]: i = 2
Thread[Thread-0,5,main]: End. (B)
Thread[main,5,main]: End. (A)