干扰线程执行的前后顺序——Thread类的join方法

经常听到这样一个面试题:如何保证多个线程的执行顺序?

答案有很多,比如使用CompletableFuture(JDK8新增),LookSupport工具类,wait和notify,还有这篇文章要写的Thread.join() 方法

  1. Thread类的 join() 方法可以阻塞当前的线程,假设线程A中执行调用了线程B的join方法,那在线程B执行完之前,A线程是无法继续往下执行的,需要注意的是 等待调用了join() 方法的线程执行完后再执行,所以使用时不能自己调用自己的join方法,这样会导致线程自身一直等待无法执行。
  2. A中调用了B的join方法,但是A不一定在B执行完成后立刻得到执行。因为join() 方法的内部其实是执行线程的wait() 方法wait() 会释放锁,释放CPU,所以join方法只能保证调用了join方法的两个线程的前后执行顺序,如果同时有线程A,B,C,线程B中调用了A的join方法,那在三个线程start后,只能保证B在A线程执行后执行,但是A执行完成释放CPU后,C也可能正在B之前执行(如果C在B之前抢到了CPU或者锁)

下面的代码中thread2中执行了thread1.join() ,thread3中执行了thread2.join(),这样一来thread2会等待thread1执行完后才执行,thread3会等待thread2执行完成后执行;最后主线程中调用thread3.join() ,等待thread3执行完后继

猜你喜欢

转载自blog.csdn.net/qq_29569183/article/details/115029646