首页 > 解决方案 > 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");

我的问题是:为什么我的答案都不被接受?问了我的实验室负责人,但他不能给我答案。在家编写测试代码,它似乎工作得很好。在此先感谢您的帮助!

标签: javamultithreading

解决方案


的解决方案join()肯定是正确的。如果我们查看官方文档,我们可以看到以下内容......

public final void join​(long millis) throws InterruptedException 最多等待毫秒毫秒以使该线程终止。超时 0 意味着永远等待。此实现使用以 this.isAlive 为条件的 this.wait 调用循环。当线程终止时,将调用 this.notifyAll 方法。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll

此方法专门设计用于处理此用例。

您可能无法获得预期结果的原因是t.sleep()您调用了对另一个线程的引用的调用,请参阅原始帖子的评论之一。


推荐阅读