java - 为什么 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();
}
解决方案
你打电话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
}
推荐阅读
- xcode - 我在我的 xcode 故事板 - 页面视图控制器中删除了*显然*有用的 XML 代码
- xml - 如何从其他站点获取 World Community Grid 团队统计信息?
- asterisk - Asterisk Dialplan:如何检测呼叫是否已成功接听?
- linux - 重命名多个目录中的多个文件
- c++ - OpenSSL:读取 EC 密钥,然后再次写入,结果不同
- c# - 使用 Microsoft Fakes 填充 SerialPort 对象
- php - 如何在 laravel 中使用视图来分块()?
- wordpress - 如何找到托管在 EC2 实例上的 WordPress 站点的 FTP 凭证?
- r - 正则表达式检测是否所有字母字符都是大写的
- javascript - VueRouter:未调用子组件