Java
的join()
官方的解释:
Waits for this thread to die.
等待当前线程直到当前线程结束。
假设现在有A
、B
,线程A
在线程B
内调用A.join()
,那么线程B
会被挂起,直到A
线程完成后才恢复。
比如线程没有使用join
public class TestJoin {
public static void main(String[] args) throws Exception {
TestJoin testJoin = new TestJoin();
Thread task = new Thread(testJoin.new Task());
System.out.println("Begin Time: " + new Date());
task.start();
System.out.println("Finish Time: " + new Date());
}
class Task implements Runnable {
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println("task: " + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
控制台输出
Begin Time: Fri Apr 14 21:36:46 CST 2017
Finish Time: Fri Apr 14 21:36:46 CST 2017
task: Fri Apr 14 21:36:48 CST 2017
Task
线程最后完成,等待了2s
。
在task.start();
后面添加task.join()
...
System.out.println("Begin Time: " + new Date());
task.start();
task.join();
System.out.println("Finish Time: " + new Date());
...
控制台输出
Begin Time: Fri Apr 14 21:38:36 CST 2017
task: Fri Apr 14 21:38:38 CST 2017
Finish Time: Fri Apr 14 21:38:38 CST 2017
可以看到主线程被挂起,等待了2s
,直到task
完成主线程才恢复。
使用interrupt()
方法可以中断join()
方法的调用。 继续上面的A
、B
线程,A
线程调用了join()
,导致B
线程挂起,如果A
线程调用interrupt()
,则A
线程被中断,抛出InterruptedException
异常,B
线程恢复。
现在修改Task
类
public class TestJoin {
public static void main(String[] args) throws Exception {
TestJoin testJoin = new TestJoin();
Thread task = new Thread(testJoin.new Task());
System.out.println("Begin Time: " + new Date());
task.start();
task.join();
System.out.println("Finish Time: " + new Date());
}
class Task implements Runnable {
@Override
public void run() {
try {
Thread.currentThread().interrupt();
Thread.sleep(2000);
System.out.println("task: " + new Date());
} catch (InterruptedException e) {
System.out.println("Task is interrupted");
}
}
}
}
在Task
的run
方法中调用Thread.currentThread().interrupt();
控制台输出
Begin Time: Fri Apr 14 21:45:11 CST 2017
Task is interrupted
Finish Time: Fri Apr 14 21:45:11 CST 2017
Task
线程被终止,主线程继续运行。