Java join 方法入门介绍

1、join()方法的作用

join()方法的作用是让当前线程等待另一个线程的完成,通常应用在线程相互调用的场景下:当在某个线程执行调用其他线程的join()方法时,调用线程将被阻塞,直到被调用线程执行完为止。下面结合代码给大家说明一下join()方法的作用:

t.join()

如上所示,但是需要注意一点:线程t并不会阻塞,而是谁调用t,谁将会被堵塞。

2、join()方法底层实现

join()方法底层是通过wait()方法实现的。在学习join()方法底层实现之前,大家要牢记一点:

只有已经获取锁的线程,才可以调用锁的wait()、notify()方法,否则会抛出异常IllegalMonitorStateException。

接下来,让我们看一看join()方法的底层:

while(t.isAlive())
{
    lock(t)
    t.wait(0);
}

上述代码,主要执行了两步关键操作。

第一步:调用线程将被调用线程t当做是锁,也就是代码:lock(t)

第二步:调用线程执行锁的wait方法,让出CPU从而进入等待状态,让其他线程可以执行,此处的“其他线程”,也就是线程t。

3、思考题:使用join()方法是否让多线程变成顺序执行呢?

先给大家出一个思考题:在main线程中启动线程t,并调用线程t的join()方法,那么是否变成了线程t先执行,main线程后执行的顺序操作呢?

补充:思考题的伪代码表示为:

void main()
{
    t.start();
    t.join();
}

显而易见,从运行情况来看,的确是线程t先执行,main线程后执行的顺序操作。但实际上并非如此。我们再看看join()方法的底层实现:

while(t.isAlive())
{
    lock(t)
    t.wait(0);
}

其实这两个线程没有先后顺序,都在CPU上随机的被执行,只不过main线程无端插入了循环,导致了它的进度有点慢,所以给人的错觉就是有了先后顺序。