Join()方法
我们可以先看一下正常的线程执行的时候是以什么样的执行顺序
//继承Thread
public class JoinTest1 extends Thread {
private String name;
public JoinTest1(String name){
this.name = name;
}
//重写run方法
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(name+"::"+i);
}
}
public static void main(String[] args) {
JoinTest1 a = new JoinTest1("A");
JoinTest1 b = new JoinTest1("B");
a.start();
b.start();
}
}
我们可以看一下多线程的情况下,其中一个线程使用的join()方法之后的执行顺序
public static void main(String[] args) throws InterruptedException {
JoinTest1 a = new JoinTest1("A");
JoinTest1 b = new JoinTest1("B");
a.start();
a.join();
b.start();
}//这里我写一下使用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");
}
if (millis == 0) {
while (isAlive()) {
wait(0);//底层还是调用了wait()方法wait(0)便是无线等待,
//直到被notify方法唤醒
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
从源码中可以看出:
底层是调用了wait()方法,join()方法是一个同步方法,当主线程调用a.join()方法之后主线程首先获取到了a的对象锁,进入到join方法中执行代码调用了wait()方法,然后主线程进入到了a线程的等待池中,等a线程指向完毕,再往下执行b.start();