等待线程执行终止的join方法
在项目中往往会遇到这样一个场景,就是需要等待几件事情都给做完后才能走下面的事情。这个时候就需要用到Thread方法下的Join方法。join方法是无参且没有返回值的。
package com.baidu.onepakage;
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread theadOne = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("TheadOne run over");
});
Thread threadTwo = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("TheadTwo run over");
});
theadOne.start();
Thread.sleep(1000);
threadTwo.start();
System.out.println("main 开始启动了");
theadOne.join();
threadTwo.join();
System.out.println("main 结束了");
}
}
上面代码在调用join方法的时候,主线程就被被阻塞了,只有当调用join的方法执行结束都才能够接着往下面执行。
执行结果:
- System.out.println(“TheadOne run over”);
- System.out.println(“TheadTwo run over”);
- System.out.println(“main 开始启动了”);
- System.out.println(“main 结束了”);
另外线程A调用线程B的join方法,当其他线程调用了线程A的interrupt()方法,则A线程会抛出InterruptedException异常而返回。
示例:
package com.baidu.onepakage;
public class JoinTest01 {
public static void main(String[] args) {
Thread threadOne = new Thread(() -> {
for (; ; ) {
}
});
// 获取主线程
Thread mainThread = Thread.currentThread();
// 线程2
Thread threadTwo = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 中断主线程
mainThread.interrupt();
});
threadOne.start();
threadTwo.start();
try {
threadOne.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(Thread.currentThread().getName() + "发生了异常");
}
}
}
上面是Mian主方法抛出了异常,这是因为在在调用ThreadOne线程,和ThreadTwo线程时线程one还在执行中(死循环),这个时候main方法处于阻塞状态,当调用主方法的interrupt()方法后,Main方法已经被阻塞了,所以就抛出了异常并返回了。