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

Javaの並行性 – Thread.join()メソッドの使い方をわかりやすく解説

join()メソッドとは

join()メソッドは、マルチスレッドプログラミングにおいて、あるスレッドの処理完了を別のスレッドが待機するために使用されるメソッドです。具体的には、スレッドAがスレッドBに対してjoin()を呼び出すと、スレッドAはスレッドBの実行が終了するまで一時停止します。これにより、スレッド同士の実行順序を明確に制御できるようになります。

引数にミリ秒を指定した場合(例:join(30))、指定された時間だけスレッドの終了を待ちます。待機中にスレッドが終了すればすぐに次の処理へ進み、終了しなければ時間切れとなって処理を再開します。なお、引数なしで呼び出した場合は、対象スレッドが完全に終了するまで無期限に待機します。

それでは、実際のコード例を見てみましょう。

サンプルコード

import java.lang.*;
public class Demo implements Runnable{
   public void run(){
      Thread my_t = Thread.currentThread();
      System.out.println("The name of the current thread is " + my_t.getName());
      System.out.println("Is the current thread alive? " + my_t.isAlive());
   }
   public static void main(String args[]) throws Exception{
      Thread my_t = new Thread(new Demo());
      System.out.println("The instance has been created and started");
      my_t.start();
      my_t.join(30);
      System.out.println("The threads will be joined after 30 milli seconds");
      System.out.println("The name of the current thread is " + my_t.getName());
      System.out.println("Is the current thread alive? " + my_t.isAlive());
   }
}

実行結果

The instance has been created and started
The name of the current thread is Thread-0
Is the current thread alive? true
The threads will be joined after 30 milli seconds
The name of the current thread is Thread-0
Is the current thread alive? false

コードの解説

このコードでは、DemoクラスがRunnableインターフェースを実装しています。run()メソッド内では、currentThread()によって現在実行中のスレッドを取得し、そのスレッド名と生存状態(isAlive()の戻り値)をコンソールに出力します。

mainメソッドでは、まずDemoクラスのインスタンスを渡して新しいスレッドオブジェクトを生成し、start()メソッドでスレッドを起動します。続いてjoin(30)を呼び出すことで、メインスレッドは最大30ミリ秒間、新しく生成したスレッドの終了を待機します。

その後に出力されるisAlive()の結果がfalseになっているのは、join(30)による待機中にスレッドの実行がすでに完了したためです。このようにjoin()を活用することで、複数スレッドの実行タイミングを確実に同期させることができます。

補足:join()メソッドの主なオーバーロード

  • join():対象スレッドが終了するまで無期限に待機します。
  • join(long millis):指定したミリ秒間だけ待機します。
  • join(long millis, int nanos):ミリ秒+ナノ秒の精度で待機します。

なお、join()は待機中に他のスレッドから割り込み(interrupt)を受けるとInterruptedExceptionをスローするため、呼び出し側では適切な例外処理を行う必要があります。

  1. JavaのisDaemon()メソッドとは?デーモンスレッドの判定方法と重要性を解説

    Javaにおけるデーモンスレッド(daemon thread)とは、低優先度のバックグラウンドスレッドのことです。主にJVMによって生成され、ガベージコレクション(GC)などの裏方の処理を担当します。デーモンスレッドの最大の特徴は、ユーザースレッドがすべて終了すると、デーモンスレッドの処理中であってもJVMが即座に終了するという点です。つまり、デーモンスレッドの唯一の目的はユーザースレッドを支援することにあり、単独ではプログラムの実行を維持できません。isDaemon()メソッドの役割isDaemon()メソッドを使用すると、あるスレッドがデーモンスレッドかどうかを判定できます。戻り値はboo

  2. Java 8におけるインターフェースの機能強化 〜デフォルトメソッドと静的メソッド〜

    Java 8で導入されたインターフェースの新機能Java 8では、インターフェースに「デフォルトメソッド(default method)」という新しい概念が導入されました。この機能は後方互換性(下位互換性)を維持するために追加されたもので、既存のインターフェースを壊すことなく、Java 8の強力なラムダ式の恩恵を受けられるようにすることを目的としています。なぜデフォルトメソッドが必要だったのか例えば、従来のListやCollectionインターフェースにはforEachメソッドの宣言が存在しませんでした。ここで単純にforEachメソッドをインターフェースへ追加すると、これらのインターフェース