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线程无端插入了循环,导致了它的进度有点慢,所以给人的错觉就是有了先后顺序。