先看一段代碼:
import java.lang.Thread;
public class ThreadJoin extends Thread{
public ThreadJoin(){
}
@Override
public void run() {
long start = System.currentTimeMillis();
System.out.println("start :"+start+" "+Thread.currentThread().getId());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end:"+System.currentTimeMillis());
System.out.println("cost:"+(System.currentTimeMillis()-start));
}
public void main(String[] args) {
ThreadJoin mythread = new ThreadJoin();
mythread.start();
try {
mythread.join(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("join:"+System.currentTimeMillis()+" "+Thread.currentThread().getId());
}
}
輸出結(jié)果:
start :1493115426349 9
end:1493115429350
cost:3001
join:1493115429350 1
可見,在 mythread.start();另開了一個子線程后,由于有join方法的插入,接下來的任務(wù)會被暫停掉。
如果沒有join方法的添加,則會直接輸出:
join:1493115534191 1 start :1493115534191 9 end:1493115537192 cost:3001
這個join方法,舉了例子就是,一個女的和男朋友一起約定去看電影,突然男朋友臨時有事,就相當(dāng)于開了一個子線程去忙其他的了,女的則跟他約定,就等你××分鐘,如果在××分鐘內(nèi)趕到,我們則馬上進(jìn)場,如果××分鐘后還沒有趕到,我就自己進(jìn)去了。
我們上面的代碼,由于子線程耗時3s,而接下來的打印動作前面的join設(shè)置的是等待4s,這樣,在第3s后,則馬上開始打印了。如果這時候修改join的方法是2s,則打印結(jié)果是:
start :1493115472005 9 join:1493115474005 1 end:1493115475006 cost:3001