Java 为什么Thread.join的行为不符合预期

Java 为什么Thread.join的行为不符合预期,java,multithreading,synchronization,Java,Multithreading,Synchronization,我不熟悉线程的概念。我做这个测试是为了了解join是如何工作的。假设join使调用线程等待,直到join实例表示的线程终止。我有两个线程t1和t2。首先,t1调用join,然后t2调用join。我希望t1在t2开始之前完成,因为join是从主线程调用的。我希望主线程从调用第一个连接的点开始等待。但事实并非如此。t1、t2和打印“线程”的行开始并行运行。既然假设主线程在等待t1完成,那么它是如何打印和调用t2的呢 public static void main(String[] args) thr

我不熟悉线程的概念。我做这个测试是为了了解join是如何工作的。假设join使调用线程等待,直到join实例表示的线程终止。我有两个线程t1和t2。首先,t1调用join,然后t2调用join。我希望t1在t2开始之前完成,因为join是从主线程调用的。我希望主线程从调用第一个连接的点开始等待。但事实并非如此。t1、t2和打印“线程”的行开始并行运行。既然假设主线程在等待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();

}

您正在以错误的顺序调用
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
}

您正在以错误的顺序调用
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
}

我希望t1在t2开始之前完成
那么你应该在加入
t1
之后开始
t2
。我制作这个小程序是为了更好地理解线程的概念,了解join是如何工作的。
我希望t1在t2开始之前完成
那么你应该在
t2
之后开始您可以加入
t1
。我制作这个小程序是为了更好地理解线程的概念,并了解join是如何工作的。