版权声明: https://blog.csdn.net/Soul_Programmer_Swh/article/details/85802837
使用场景
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时,如果主线程向等待子线程执行完成后再结束,就需要用到join()方法了。
join()的作用是等待线程对象销毁。
方法join具有使线程排队运行的作用,有些类似同步的运行效果。join与synchronized的区别是:join在内部使用了wait()方法进行等待,而synchronized关键字使用的是“对象监视器”原理作为同步。
方法join与异常
在join方法执行过程中,如果当前线程对象被中断interrupt(),则当前线程会出现异常:java.lang.InterruptedException
方法join(long)的使用
方法join(long)中的参数是设定等待的时间。
join(2000)和sleep(2000)的区别
主要体现在对同步的处理上。
方法join(long)的功能在内部是使用wait(long)方法来实现的,所以join(long)方法具有释放锁的特点。而方法Thread.sleep(long)却不释放锁。
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);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
会有意外:join()后面的代码会提前运行
如果读者对此有兴趣可以给我评论,我会在评论中对此现象做出解释。