作用
1、等待线程死亡:准确地说,应该是一直等到这个线程的run方法执行完毕。
2、之所以要等待这个线程执行完毕的原因是,可能其他的线程或者接下来的业务逻辑代码会依赖这个线程的执行结果,所以要调用join()方法来一直等到这个线程执行完毕,再执行其他的任务。
示例代码
/**
* 在战争这个舞台上,
* 1、一会儿隋军多次5连击农民军
* 2、一会儿农民军又多次反击隋军
* 3、但更多的时候是你来我往分不出胜负,最后各自鸣金收兵
* @author Administrator
*
*/
public class Stage extends Thread{
public void run(){
//使用Runnable接口来创建军队线程
ArmyRunnable taskSuiJun = new ArmyRunnable();
ArmyRunnable taskNongMingJun = new ArmyRunnable();
Thread suiJun = new Thread(taskSuiJun,"隋军");
Thread nongMingJun = new Thread(taskNongMingJun,"农民军");
//启动线程
suiJun.start();
nongMingJun.start();
//舞台线程休眠,大家专心观看厮杀
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//互相厮杀一段时间(大概是50ms)之后,各自鸣金收兵
taskSuiJun.keepRunning = false;
taskNongMingJun.keepRunning = false;
//在这里没什么用,因为后面没有其他的任务了
try {
nongMingJun.join(); //1、等待这个线程死亡:准确地说,应该是一直等到这个线程的run方法执行完毕 2、作用是,这个线程执行完毕之后,再执行另外的线程或者其他的业务逻辑(试想一下,如果另外的线程或者其他的业务逻辑依赖这个线程的执行结果的话,那么这个方法就超级好用)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 入口方法
* @param args
*/
public static void main(String[] args){
new Stage().start(); //舞台剧开始
}
}
/**
* 模拟军队作战攻击
* @author Administrator
*
*/
public class ArmyRunnable implements Runnable{
/**
* 用于标识是否攻击
*/
volatile boolean keepRunning = true;
@Override
public void run() {
while(keepRunning){
//5连击
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName() + ":第"+ i + "发动攻击");
Thread.yield(); //让当前线程放弃cpu执行;cpu下一次执行哪个线程重新分配,也就是说是不确定的
}
}
System.out.println(Thread.currentThread().getName() + "战斗结束!");
}
}
参考
1、http://blog.csdn.net/hustpzb/article/details/8472929