Thread Join在我们实际业务场景中使用的场景可能不是很多,java.util.concurrent包下面已经提供很多种方式来帮我们解决线程同步问题,这里可以作为简单的使用和了解。
/**
* Join: Waits for this thread to die. 等待线程死亡!
* 底层通过jdk synchronized wait notify 实现
* 使用场景 地铁站过安检时,需把背包放入检查台流水线,行人才能进入站内,背包和人同时移动,但是行人速度较快,需要在另一端等到背包安检完成。
*/
public class JoinTest {
public static final Logger logger = LoggerFactory.getLogger(JoinTest.class);
public static void main(String[] args) throws InterruptedException {
//准备2个线程
Thread thread1 = getThread();
Thread thread2 = getThread();
//启动1第一个线程
thread1.start();
//第一个线程执行完成才能执行后面任务
thread1.join();
thread2.start();
thread2.join();
logger.info(Thread.currentThread().getName() + "等待thread1和thread2执行结束,在执行后续操作!");
}
private static Thread getThread() {
return new Thread(() -> {
try {
logger.info(Thread.currentThread().getName() + "开始任务=======================");
//模拟1秒钟任务
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info(Thread.currentThread().getName() + "任务执行完成之后,下面才能执行,不然一直被阻塞");
});
}
}
日志输出:
16:05:55.508 [Thread-0] INFO com.test.tenant.JoinTest - Thread-0开始任务=======================
16:05:56.515 [Thread-0] INFO com.test.tenant.JoinTest - Thread-0任务执行完成之后,下面才能执行,不然一直被阻塞
16:05:56.515 [Thread-1] INFO com.test.tenant.JoinTest - Thread-1开始任务=======================
16:05:57.519 [Thread-1] INFO com.test.tenant.JoinTest - Thread-1任务执行完成之后,下面才能执行,不然一直被阻塞
16:05:57.520 [main] INFO com.test.tenant.JoinTest - main等待thread1和thread2执行结束,在执行后续操作!
Process finished with exit code 0