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

JavaのThreadクラスのjoin()メソッドとは?使い方と動作を実例で解説


joinメソッドは、現在実行中のスレッドに対して、「joinが呼び出されたスレッドが終了するまで待機する」よう指示するための機能です。このメソッドを呼び出すと、呼び出し元のスレッドは、対象スレッドの処理が完全に終了するまでブロックされます。複数のスレッドの実行順序を制御したい場合に役立つ、重要なメソッドです。

構文

final void join() throws InterruptedException

join()には、待機時間を指定できるオーバーロード版も用意されています。

  • join(long millis) … 指定したミリ秒だけ待機し、時間内にスレッドが終了しなくても処理を再開します。
  • join(long millis, int nanos) … ミリ秒+ナノ秒の精度で待機時間を指定できます。

サンプルコード

public class Demo extends Thread {
   public void run(){
      System.out.println("sample ");
      try{
         Thread.sleep(10);
      }
      catch (InterruptedException ie){
      }
      System.out.println("only ");
   }
   public static void main(String[] args){
      Demo my_obj_1 = new Demo();
      Demo my_obj_2 = new Demo();
      my_obj_1.start();
      System.out.println("1つ目のオブジェクトを作成し、開始しました");
      try{
         System.out.println("tryブロック内で、1つ目のオブジェクトに対してjoin関数を呼び出します");
         my_obj_1.join();
      }
      catch (InterruptedException ie){
      }
      System.out.println("2つ目のオブジェクトを開始しました");
      my_obj_2.start();
   }
}

実行結果

1つ目のオブジェクトを作成し、開始しました
tryブロック内で、1つ目のオブジェクトに対してjoin関数を呼び出します
sample 
only 
2つ目のオブジェクトを開始しました
sample 
only 

コードの解説

このコードでは、DemoクラスがThreadクラスを継承しています。run()メソッド内にはtry-catchブロックが定義されており、tryブロックでsleep()メソッドを呼び出し、catchブロックは空のままとなっています。

main()メソッドでは、Demoクラスのインスタンスを2つ生成しています。まず1つ目のオブジェクトをstart()で起動し、続けてjoin()を呼び出します。これにより、メインスレッドは1つ目のスレッドが終了するまで待機することになります。そのため、出力結果を見ると「sample」「only」が先に表示され、その後で2つ目のオブジェクトが開始されているのが分かります。

もしjoin()を使用しなければ、2つのスレッドは並行して実行されるため、出力順序は実行のたびに変わる可能性があります。join()を使うことで、スレッドの終了を確実に待ち合わせ、実行順序を制御できるのです。

ポイントまとめ

  • join()を呼び出すと、呼び出し元のスレッドは対象スレッドの終了を待機する
  • 待機中に割り込みが発生するとInterruptedExceptionがスローされるため、try-catchでの例外処理が必要
  • スレッドの実行順序を保証したい場面で特に有効

  1. JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説

    SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi

  2. JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作

    JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()