Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのjoin()メソッドとは?スレッドの実行順序を制御する重要性を解説

Javaにおけるjoin()メソッドは、Threadクラスfinalメソッドの一つです。このメソッドは、あるスレッドの実行開始を別のスレッドの実行終了に結びつける(joinする)ために使用されます。つまり、先に開始したスレッドが完全に終了するまで、次のスレッドは実行を開始できません。

具体的には、あるスレッドインスタンスに対してjoin()メソッドを呼び出すと、現在実行中のスレッドは、そのスレッドインスタンスの処理が完了するまで待機状態(ブロック)になります。これにより、複数のスレッドの実行順序を明確に制御することが可能になります。

構文

public final void join() throws InterruptedException

join()メソッドは待機中に割り込み(interrupt)を受けるとInterruptedExceptionをスローする可能性があるため、呼び出し側では例外処理が必要です。なお、引数付きのオーバーロード版である join(long millis)join(long millis, int nanos) を使えば、最大待機時間を指定することもできます。

コード例

public class JoinTest extends Thread {
    public void run() {
        for(int i=1; i <= 3; i++) {
            try {
                Thread.sleep(1000);
            } catch(Exception e) {
                System.out.println(e);
            }
            System.out.println("TutorialsPoint " + i);
        }
    }
    public static void main(String args[]) {
        JoinTest t1 = new JoinTest();
        JoinTest t2 = new JoinTest();
        JoinTest t3 = new JoinTest();
        t1.start();
        try {
            t1.join(); // join()メソッドを呼び出し
        } catch(Exception e) {
            System.out.println(e);
        }
        t2.start();
        t3.start();
    }
}

実行結果

TutorialsPoint 1
TutorialsPoint 2
TutorialsPoint 3
TutorialsPoint 1
TutorialsPoint 1
TutorialsPoint 2
TutorialsPoint 2
TutorialsPoint 3
TutorialsPoint 3

動作の解説

上記の例では、まずスレッドt1を開始した直後に t1.join() を呼び出しています。そのため、メインスレッドはt1が「1」「2」「3」とすべて出力し終えるまで待機します。t1が完了した後、t2とt3がほぼ同時に開始されるため、以降の出力はt2とt3が交互に実行された結果となっています。

もしjoin()を呼び出さなければ、t1・t2・t3の3つのスレッドが並行して動作し、出力順序は毎回異なる不確定なものになります。join()メソッドを使うことで、スレッド間の依存関係を明示的に表現し、実行順序を保証できるのが最大のメリットです。

まとめ

  • join()はThreadクラスのfinalメソッドであり、オーバーライドは不可
  • 呼び出し元のスレッドは、対象スレッドの終了までブロックされる
  • InterruptedExceptionをスローするため、try-catchによる例外処理が必須
  • スレッドの実行順序を制御したい場面で非常に有用
  1. JavaのThreadクラスのjoin()メソッドとは?使い方と動作を実例で解説

    joinメソッドは、現在実行中のスレッドに対して、「joinが呼び出されたスレッドが終了するまで待機する」よう指示するための機能です。このメソッドを呼び出すと、呼び出し元のスレッドは、対象スレッドの処理が完全に終了するまでブロックされます。複数のスレッドの実行順序を制御したい場合に役立つ、重要なメソッドです。構文final void join() throws InterruptedExceptionjoin()には、待機時間を指定できるオーバーロード版も用意されています。join(long millis) … 指定したミリ秒だけ待機し、時間内にスレッドが終了しなくても処理を再開します。joi

  2. Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説

    destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc