Java 多线程join方法的使用

在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()方法了。

方法join():等待线程对象销毁
作用:使所属的线程对象x正常执行run()方法中的任务,而使线程z进行无限制的阻塞,
等待线程x销毁后再继续执行线程z后面的代码。

方法join具有使线程排队运行的作用,有些类似同步的运行效果。

join与synchronized的区别
join再内部使用wait()方法进行等待,而synchronized关键字的使用是对象监视器原理为同步。

方法join与异常
在join过程中,如果当前线程对象被中断,则当前线程出现异常。
方法join()与interupt()方法如果彼此遇到,则会出现异常。

方法join(long)的使用:设定等待的时间
方法join(long)与sleep(long)的区别
方法join(long)的功能在内部是使用wait(long)方法来实现的,所以join(long)方法具有释放锁的特点。
当执行wait(long)方法后,当前线程的锁被释放,那么其他线程就可以调用此线程中的同步方法了。
而Thread.sleep(long)方法却不释放锁。

方法join()后面的代码提前运行:解释意外

下面通过代码制造意外
Java 多线程join方法的使用
Java 多线程join方法的使用
Java 多线程join方法的使用
运行结果:
Java 多线程join方法的使用
为了查看join()方法在Run中的执行时机。创建RunFirst.java类;
Java 多线程join方法的使用
Java 多线程join方法的使用
join(2000)大部分是先运行的,也就是先抢到ThreadB的锁,然后快速进行释放。