转载请注明出处:https://my.oschina.net/wfy94/blog/861568
定义:等待终止指定的线程(书上拗口我这样解释:A线程等待指定的B线程终止后接着执行A线程)
情景:一个完成初始化任务的线程、一个工作的线程、一个完成善后的线程,分析一下这三个线程的关系,工作线程开始工作,必须要等到初始化线程把需要的资源加载完成,善后的线程需要工作线程处理完任务方可执行。三个线程都被启动,会随机分配CPU,工作线程无法确定初始化是否完成,善后线程也无法确定工作线程是否执行完毕,这种情况下,应该如何控制程序合理的调度呢?
public class MainTest {
private static Thread init;
private static Thread work;
private static Thread car;
public static void main(String[] args) {
init=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
System.out.println("初始化中..."+(10-i));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
work=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("工作平台搭建好等待资源正在等待初始化......");
init.join();
System.out.println("开始工作");
for(int i=0;i<7;i++){
Thread.sleep(1000);
System.out.println("工作"+(i+1)+"小时");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
car=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("老司机已来,等待小伙伴下班上车......");
work.join();
System.out.println("下班啦,都上车");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
car.start();
init.start();
work.start();
}
}
程序输出:
老司机已来,等待小伙伴下班上车......
初始化中...10
工作平台搭建好等待资源正在等待初始化......
初始化中...9
初始化中...8
初始化中...7
初始化中...6
初始化中...5
初始化中...4
初始化中...3
初始化中...2
初始化中...1
开始工作
工作1小时
工作2小时
工作3小时
工作4小时
工作5小时
工作6小时
工作7小时
下班啦,都上车
观察上面的例子,日志输出,可以发现在工作者线程执行到init.join()方法后,并没有接着打印工作小时,而是等待init线程执行完毕,到这里可以看出join的意思是,在某线程中调用另一个线程的join,会阻塞当前线程的执行,直到执行完另一线程后,才继续执行。