jion使用环境:主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束。
首先是不加join的情况:
public class CallableDemo implements Runnable {
/**
* 2----join
* @author Sure
* @since 2021/2/25 11:50
* @param null :
* @return null
*/
private String name;
public CallableDemo(String name) {
this.name=name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程运行开始");
for (int i = 0; i < 5; i++) {
System.out.println("子线程"+name+"运行"+i);
try {
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Main {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"主线程运行开始");
new Thread(new CallableDemo("C")).start();
new Thread(new CallableDemo("D")).start();
System.out.println(Thread.currentThread().getName()+"主线程运行结束");
}
}
可以看到主线程提前结束:
接下来稍微修改下main方法加入join:
class Main {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"主线程运行开始");
Thread c = new Thread(new CallableDemo("C"));
Thread d = new Thread(new CallableDemo("D"));
c.start();
d.start();
try {
c.join();
}
catch (InterruptedException e){
e.printStackTrace();
}
try {
d.join();
}
catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"主线程运行结束");
}
主线程等待子线程运行完之后结束: