说到join的使用,这边先讲一个案例。
假设这边有一个线程,在run方法里面随机睡眠一段时间。因为睡眠时间的不确定性,所以如果想要等到这个线程执行完在去执行另外一个线程的话,用睡眠唤醒另一个线程也不太实际。那么现在join方法就能做到这件事,join方法就是使一个线程等待另外一个线程执行完毕后执行。下面看一下简单的测试方法。
测试类
这边就能做到main线程等待mt线程执行完毕后继续执行~~相当于睡眠了mt线程一样的时间。那么join底层的原理是什么呢?我们来看下源码。
这里调用的是join(0),也就是millis为0 。可以看到这边底层是用wait方法来实现的,具体wait介绍可以看之前的代码。
mt.join()的作用是使所属线程mt执行完毕后(线程main处于阻塞状态),main线程等待mt线程执行完毕后在执行main后面的代码。
方法join也可以使线程类似于同步的运行,而join与synchronized的区别主要就是上面源码中展示的join使用wait方法进行等待(释放了锁)。而synchronized使用的是“对象监视器”原理作为同步。