这个我查了很多的网站都没有给一个比较合理的解释,但终于还是自己清楚了。
首先说一下在JDK中的解释
join():Waits for this thread to die.就是等待这个线程的结束(die)
join(long millis) :Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever. 也就是在设置的millis是间内等待线程的结束,如果超时,将无限的等直到这个线程结束。
join()用法很简单这里就不再说了、只说一下join(long millis) 的用法。有一个例子说明一下:
package tread;
public class WaitAThreadToDie {
public static void main(String[] args) {
Thread first=new WaitThreaDie("a","a",200);
Thread second=new WaitThreaDie("b","b",300);
Thread third=new WaitThreaDie("c","c",500);
first.start();
second.start();
third.start();
try{
first.join(2000);//当主线程运行到这里的时候让其等2000毫秒让first线程结束,但是second 和third还按它们创建的时间运行和结束
}catch(InterruptedException e){
}
System.out.println("hanjiang");// 当主线程运行到这的时候输出这个字符串
}
}
class WaitThreaDie extends Thread{
private String firstName,secondName;
private long total,aWhile;
public WaitThreaDie(String firstName,String secondName,long waitTime){
this.aWhile=waitTime;
this.firstName=firstName;
this.secondName=secondName;
}
public void run(){
try{
while(total<1000){// 当sleep超过1000毫秒时些线程结束
System.out.println(firstName);
sleep(aWhile);
total+=aWhile;
System.out.println(secondName+" sleep");//表示当前这个线程sleep了一次
}
}catch(InterruptedException e){
System.out.println("cus Thread interrupted!..");
}
System.out.println(secondName+" stopped!");
}
}
运行结果如下:
a
b
c
a sleep
a
b sleep
b
a sleep
a
c sleep
c
a sleep
a
b sleep
b
a sleep
a
b sleep
b
a sleep
a stopped! // first线程结束
hanjiang // 当first结束时时就输出这个这符串
c sleep
c stopped!
b sleep
b stopped!
当然了,可以看到first线程最先结束,但是这和 jion(2000); 无关,在线程运行的任务完成时,线程就会结束,这时设置的这个时间参数就没有实际作用了。下面从输出线路果进行分析,三个线程的sleep的次数分别是:
first: 5次
second : 4次
third : 3次
然而线程的结束顺序是 firist->third->second
因为在first sleep了5次之后,运行时间就有1000毫秒了,这时候second还没有运行结束了,因为这时候scond 每次加的是300毫秒,他只有sleep了4次之后也就是加到1200毫秒时才会超过1000毫秒,所以此时second还没有运行结束,可是理论上third 也结束了,但是为什么third没有在first之前结束呢?这是因为first是先start()的,而且每一个start()都要分配内存等信息,所以会花费时间,于是必然也就是first先结束了。也就是在这个时间差,这时MAIN.Thread 也就是主线程就会接着输出字符串"hanjiang" 了。所以以上的线结果就完全的合理了,这当然也是计算机的计算顺序了。。