java - Java 线程 - 如何正确等待线程完成?
问题描述
我在大学进行了一次测试,告诉我修复下面的代码,因此它会等待线程完成后再打印“END”。MyThread 的内容未知:
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
System.out.println("END");
起初我的解决方案是 join() 2个线程,但这不起作用。
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
s1.join();
s2.join();
System.out.println("END");
然后我尝试使用 while 循环检查线程是否还活着。
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.sleep(1000);
s2.sleep(1000);
while(s1.IsAlive() || s2.IsAlive){
continue;
}
System.out.println("END");
但这一个也不起作用。显然正确的答案是加入线程并删除 2 个睡眠:
Thread s1 = new MyThread();
Thread s2 = new MyThread();
s1.start();
s2.start();
s1.join();
s2.join();
System.out.println("END");
我的问题是:为什么我的答案都不被接受?问了我的实验室负责人,但他不能给我答案。在家编写测试代码,它似乎工作得很好。在此先感谢您的帮助!
解决方案
的解决方案join()
肯定是正确的。如果我们查看官方文档,我们可以看到以下内容......
public final void join(long millis) throws InterruptedException 最多等待毫秒毫秒以使该线程终止。超时 0 意味着永远等待。此实现使用以 this.isAlive 为条件的 this.wait 调用循环。当线程终止时,将调用 this.notifyAll 方法。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll
此方法专门设计用于处理此用例。
您可能无法获得预期结果的原因是t.sleep()
您调用了对另一个线程的引用的调用,请参阅原始帖子的评论之一。
推荐阅读
- ios - 如何在 Swift 代码中为 3 个条件编写 Ternaray 条件运算符
- javascript - 在 NestJs 中何时使用守卫以及何时使用中间件
- java - 防止自定义系统字体覆盖应用程序字体
- php - 使用 mysql 在 Codeigniter 中“创建视图”和“其他查询”合并问题
- sql - 如何在 Woocommerce 数据库中按类别 SQL 查询产品 _wp_attached_file 路径?
- sql - 在redshift上工作,每天有数十亿条记录,sql查询和聚合太慢?关于如何让它更快的任何提示
- visual-studio-code - 将 Dockerfile 语言与 VS Code 中的所有 Dockerfile 关联
- sumo - SUMO traci.simulation.findroute.m
- vb.net - 如何在 vb.net 中删除 list(Of) 中的最后一项
- aws-codecommit - Organise AWS CodeCommit repositories in groups/projects