如果一个线程A(比如主线程)调用了另一个线程B(一个子线程)的join方法,主线程会等待调用join方法的子线程执行结束后再继续执行,上代码
package cn.cncc.demo;
public class TestJoin {
//main线程就是个引导/启动程序,启动后如果没它什么事情它就先结束了
public static void main(String[] args) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " start.");
PrepareWorkThread pt = new PrepareWorkThread("准备上班");
PreparebBreakfast pb = new PreparebBreakfast("做早饭");
pt.setPb(pb);
pt.start();
try {
//加上这句,是让main线程等待pt线程执行完再往下走
pt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(threadName + " end.");
}
}
/**
* 准备上班线程
* 起床,洗簌,然后吃早饭,去上班
* 另起一个线程做早饭
* @author root
*
*/
class PrepareWorkThread extends Thread{
PreparebBreakfast pb;
public PrepareWorkThread(String string) {
super(string);
}
public void setPb(PreparebBreakfast pb) {
this.pb = pb;
}
public void run() {
System.out.println("起床...............");
System.out.println("通知佣人去做早饭.......");
//启动做早饭线程
pb.start();
for(int i = 0;i<5;i++){
System.out.println("洗簌..............." +i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("洗簌结束...............");
try {
System.out.println("等待早饭做好..........");
//等待做早饭线程执行完成,此时当前这个线程处于等待状态
pb.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("吃早饭..............");
System.out.println("上班去了.............");
}
}
class PreparebBreakfast extends Thread{
public PreparebBreakfast(String name) {
super(name);
}
@Override
public void run() {
for(int i = 0;i<10;i++){
System.out.println("正在做早饭........." + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("早饭做好了.........");
}
}