join:加入线程,顺序执行。
官方解释:当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。
即:在main线程中调用子线程的join方法,join方法会挂起main线程,直到子线程结束执行,main线程才会继续执行。
示例:子线程加入main线程,子线程执行后再执行main线程。
public class MyJoinThread extends Thread{
public void run() {
System.out.println("I am join thread");
}
}
public class Main{
public static void main(String args[]) {
Thread joinThread = new MyJoinThread();
try {
joinThread.start();
joinThread.join();
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("I am main thread");
}
}
下面是join方法源码:
public final synchronized void join(long millis) throws InterruptedException {
long base = System.currentTimeMillis();
long now =0;
if (millis <0) {
throw new IllegalArgumentException("timeout value is negative");
}
//当timeout为0时,即一直等到子线程执行完毕后再执行主线程
if (millis ==0) {
//循环判子线程是否active,子线程是active则让主线程等待
while (isAlive()) {
wait(0);
}
}
//当timeout不为0时,即让主线程等待timeout时间后就继续执行
else {
//循环判子线程是否active,子线程是active则让主线程等待,如果超出timeout时间,则不再等待
while (isAlive()) {
long delay = millis - now;
if (delay <=0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
网友评论