I.概要
wait( )メソッドやnotify()メソッドと 同様に 、join()は別のスレッド間同期メカニズムです。
join()メソッドが呼び出されると、呼び出し元のスレッドは待機状態になります。呼び出されたスレッドが終了するまで待機します。
2. Thread.join()メソッド
参照コード
class SampleThread extends Thread {
public int processingCount = 0;
public SampleThread(int processingCount) {
this.processingCount = processingCount;
LOGGER.info("Thread Created");
}
@Override
public void run() {
LOGGER.info("Thread " + this.getName() + " started");
while (processingCount > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LOGGER.info("Thread " + this.getName() + " interrupted");
}
processingCount--;
}
LOGGER.info("Thread " + this.getName() + " exiting");
}
}
@Test
void test_join()
{
Thread t2 = new SampleThread(1);
t2.start();
System.out.println("Invoking join");
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Returned from join");
System.out.println(t2.isAlive());
}
出力は次のとおりです
スレッドが作成され ましたjoinを呼び出します ThreadThread-2が開始されました ThreadThread-2が終了 しましたjoinから返されまし たfalse
join()メソッドは、参照されるスレッドが中断された場合にも返される場合があります。この場合、メソッドはInterruptedExceptionをスローします。
最後に、参照されているスレッドが終了しているか、開始されていない場合、join()メソッドを呼び出すとすぐに戻ります。
3.タイムアウトのあるThread.join()メソッド
join()メソッドは、参照されるスレッドがブロックされているか、処理に時間がかかりすぎる場合、引き続き待機します。呼び出し元のスレッドが応答しなくなるためです。これらのケースを処理するために、タイムアウトを指定できる、オーバーロードされたバージョンのjoin()メソッドを使用します。
オーバーロードされたjoin()メソッドには2つの時限バージョンがあります。
public final void join(long millis) throws InterruptedException
public final void join(long millis,int nanos) throws InterruptedException
テストコード
@Test
public void waitsUntilTimedout()
throws InterruptedException {
Thread t3 = new SampleThread(10);
t3.start();
t3.join(1000);
assertTrue(t3.isAlive());
}
この場合、呼び出し元のスレッドは、スレッドt3が完了するまで約1秒待機します。スレッドt3がこの時間内に完了しない場合、join()メソッドは呼び出し元のメソッドに制御を戻します。
時限join()は、OSのタイミングによって異なります。指定された時間待機する時間と必ずしも同じではありません。