Thread.Join()
Thread类中的Join方法可以是线程间的并行执行变为串行执行。join方法放弃当前线程的执行,执行join对应的线程。
示例
程序在main线程中调用t1线程的join方法,则main线程放弃cpu控制权,并返回t1线程继续执行直到线程t1执行完毕
所以结果是t1线程执行完后,才到主线程执行,相当于在main线程中同步t1线程,t1执行完了,main线程才有执行的机会,继续执行t2线程。其中join方法int参数为t1线程执行时间,即被中断的线程等待t1执行n毫秒后再执行。
public class ThreadJoinTest {
public static void main(String[] args) throws Exception{
ThreadJoinDemo t1 = new ThreadJoinDemo("小明");
ThreadJoinDemo t2 = new ThreadJoinDemo("小红");
t1.start();
t1.join(10);
t2.start();
}
}
class ThreadJoinDemo extends Thread{
public ThreadJoinDemo(String name){
super(name);
}
@Override
public void run(){
for(int i=0;i<100;i++){
System.out.println(this.getName()+":"+i);
}
}
}
原理
当前线程A调用线程B的join方法时相当于调用了wait方法。当B线程执行完或达到等待时间后B线程会自动调用吱声的notifyAll方法唤醒A线程。
源码
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);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}