首页 > 解决方案 > 为什么 Thread.join 的行为不符合预期

问题描述

我是线程概念的新手。我做了这个测试来了解 join 是如何工作的。假设 join 会导致调用线程等待,直到由 join 实例表示的线程终止。我有两个线程 t1 和 t2。首先,t1 调用 join,然后 t2 调用 join。我期待 t1 在 t2 开始之前完成,因为 join 是从主线程调用的。我期待主线程从调用第一个连接的点开始等待。但这不是它的行为方式。t1、t2 和打印“Thread”的行开始并行运行。既然假设它正在等待 t1 完成,那么主线程是如何管理打印和调用 t2 的?

public static void main(String[] args) throws InterruptedException, ExecutionException  {

    Thread t1 = new Thread(new A());
    Thread t2 = new Thread (new B());

    t1.start();
    t2.start();

    t1.join();
    System.out.println("Thread");
    t2.join();

}

标签: javamultithreadingsynchronization

解决方案


你打电话join的顺序不对。启动t1然后调用join,以便主线程等待t1死亡然后启动t2

public static void main(String args[]) throws InterruptedException{
  Thread t1 = new Thread(() -> System.out.println("a"));
  Thread t2 = new Thread (() -> System.out.println("b"));

  t1.start();
  t1.join(); //main waits for t1 to finish
  System.out.println("Thread");
  t2.start();
  t2.join(); //main waits for t2 to finish
} 

输出:

a
Thread
b

当您同时启动t1然后t2调用t1.join()主线程时确实在等待t1死亡,因此t1将执行直到它完成但在后台t2已经开始执行,这就是您看到两个线程并行运行的原因。

public static void main(String args[]) throws InterruptedException{
   Thread t1 = new Thread(() -> System.out.println("a"));
   Thread t2 = new Thread (() -> System.out.println("b"));

   t1.start(); //Started executing 
   t2.start(); //Started executing

   t1.join(); //main thread waiting for t1, but in the background t2 is also executing independently 
   System.out.println("Thread");
   t2.join(); //main again waiting for t2 to die
}

推荐阅读