线程的合并
线程的合并
CAMELLIA线程的合并
在Java中,join()
方法是Thread类中的一个方法,它允许一个线程等待另一个线程完成执行后再继续执行。
具体来说,当一个线程调用另一个线程的join()
方法时,它会暂停自己的执行,直到被调用的线程执行完毕或者超时。
join()方法是一个实例方法。(不是静态方法)
假设在main方法(main线程)中调用了 t.join(),后果是什么?
- t线程合并到主线程中。主线程进入阻塞状态。直到 t 线程执行结束。主线程阻塞解除。
和sleep方法有点类似,但不一样:
- 第一:sleep方法是静态方法,join是实例方法。
- 第二:sleep方法可以指定睡眠的时长,join方法不能保证阻塞的时长。
- 第三:sleep和join方法都是让当前线程进入阻塞状态。
- 第四:sleep方法的阻塞解除条件?时间过去了。 join方法的阻塞解除条件?调用join方法的那个线程结束了。
一、join()
方法的使用方式
基本用法:
1
2
3
4
5
6
7
8
9
10
11
12
13Thread thread = new Thread(() -> {
// 线程执行的代码
});
thread.start(); // 启动线程
try {
thread.join(); // 等待thread线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
// 在这里可以确保thread线程已经执行完毕在上面的例子中,调用了
thread.join()
方法,主线程将会等待thread
线程执行完毕后再继续执行。超时等待:
1
2
3
4
5try {
thread.join(1000); // 等待thread线程最多1秒,超时后会继续执行
} catch (InterruptedException e) {
e.printStackTrace();
}可以通过
join(long millis)
方法指定一个超时时间,单位为毫秒。如果指定时间内线程未执行完毕,则超时后会继续执行。中断处理:
1
2
3
4
5
6try {
thread.join();
} catch (InterruptedException e) {
// 处理中断异常
e.printStackTrace();
}join()
方法会抛出InterruptedException
异常,通常在等待的线程被中断时会触发此异常。因此,在调用join()
时需要考虑如何处理中断异常。
二、join()
方法的应用场景
线程顺序执行:当需要确保线程按照某种顺序执行时,可以在一个线程中调用另一个线程的
join()
方法。任务依赖:当一个任务依赖于另一个任务的结果时,可以在等待另一个任务完成后再进行处理。
协同工作:多个线程协同工作时,有时需要等待某个关键线程完成某个阶段后再进行下一步操作。
三、示例代码
1 | package com.camellia.thread.ThreadMerging; |