gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:46:28 27 4
gpt4 key购买 nike

我对线程的概念很陌生。我做了这个测试是为了了解 join 是如何工作的。 join 假设导致调用线程等待,直到 join 实例表示的线程终止。我有两个线程 t1 和 t2。首先,t1 调用 join,然后 t2 调用 join。我期望 t1 在 t2 开始之前完成,因为 join 是从主线程调用的。我期望主线程从调用第一个连接的地方开始等待。但它的行为方式并非如此。 t1、t2 和打印“Thread”的行开始并行运行。主线程如何设法打印并调用 t2,因为它应该等待 t1 完成?

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

当您启动 t1t2 然后调用 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
}

关于java - 为什么 Thread.join 的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54603905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com