当前位置: 首页 > 面试题库 >

我如何暂停main(),直到所有其他线程都死掉了?

茹建茗
2023-03-14
问题内容

在我的程序中,我正在main()方法中创建多个线程。main方法的最后一行是对System.out.println()的调用,在所有线程都死亡之前,我不希望调用它。我试过在每个线程上调用Thread.join(),但是会阻塞每个线程,以便它们顺序执行而不是并行执行。

有没有一种方法可以阻塞main()线程,直到所有其他线程执行完毕?这是我的代码的相关部分:

public static void main(String[] args) {

//some other initialization code

//Make array of Thread objects
Thread[] racecars = new Thread[numberOfRaceCars];

//Fill array with RaceCar objects
for(int i=0; i<numberOfRaceCars; i++) {
    racecars[i] = new RaceCar(laps, args[i]);
}

//Call start() on each Thread
for(int i=0; i<numberOfRaceCars; i++) {
    racecars[i].start();
    try {
        racecars[i].join(); //This is where I tried to using join()
                            //It just blocks all other threads until the current                            
                            //thread finishes.
    } catch(InterruptedException e) {
        e.printStackTrace();
    }
}

//This is the line I want to execute after all other Threads have finished
System.out.println("It's Over!");

}

感谢您的帮助!

埃里克


问题答案:

您启动线程并立即等待完成(使用join())。相反,您应该join()在另一个for循环中进行for循环的外部操作,例如:

// start all threads
for(int i=0; i<numberOfRaceCars; i++) {
    racecars[i].start();
}
// threads run... we could yield explicity to allow the other threads to execute
// before we move on, all threads have to finish
for(int i=0; i<numberOfRaceCars; i++) {
    racecars[i].join(); // TODO Exception handling
}
// now we can print
System.out.println("It's over!");


 类似资料:
  • 问题内容: 我向Java的executorservice提交了一堆作业,但我想以某种方式暂时暂停所有这些作业。最好的方法是什么?我该如何恢复?还是我这样做完全错误?我是否应该遵循其他想要实现的模式(即暂停/恢复执行服务的能力)? 问题答案: 为了回答我自己的问题,我在 本身的javadocs中找到了一个示例。这是我使用番石榴显示器的版本:

  • 问题内容: 我声明我已阅读有关线程的内容,但从未使用过。所以我问你:) 我有两个线程:和,其中管理GUI和逻辑。 我将从开始。 然后在绘制GUI时,我将其暂停,以等待到达X点的run方法。 当到达X点进入run方法时,我暂停并继续。 并共享一些变量来管理GUI和逻辑… 我可以做吗?如果是,如何?:) 问题答案: 使用和方法: -使当前线程等待,直到另一个线程调用 该对象的方法。 -唤醒正在该对象的

  • 本文向大家介绍C#程序暂停线程,包括了C#程序暂停线程的使用技巧和注意事项,需要的朋友参考一下 要在C#中暂停线程,请使用方法。 您需要设置线程要暂停的毫秒数,例如5秒钟,请使用- 示例 让我们看看如何循环并设置sleep方法来暂停线程。 输出结果

  • 在调试应用程序时,我希望主线程在我放入JavaFX事件队列的每个Runnable之后等待 等待它被执行(即可见)。然而,这里有两个问题: 首先,它并不是一个标准的、GUI驱动的JavaFX应用程序。它更像是一个脚本,显示和更新一个JavaFX阶段。所以结构看起来像这样: 其次,禁用此“功能”应该很容易,即等待Runnable执行(使用当前方法没有问题,但使用替代方法也应该可行)。 做这件事的最好方

  • 问题内容: 我有一个程序’foo’运行不同的线程,fooT1,fooT2,.. fooTn。 现在,如果我想编写另一个程序“ bar”,它可能会杀死线程fooTr,那可能吗? 原因:fooTr线程之一跟踪产品许可证。如果该线程被杀死;可能会无限期地运行此产品。杀死’foo’本身可以容忍为’foo’,因为这正是许可证到期时所做的事情。 系统:Linux的Fedora发行 注:用于启动JVM和程序fo

  • 注意:我工作了很多时间并研究了google和stackoverflow,但我找不到答案。 我用线。sleep(),它冻结了所有其他JDialog、JFrame和线程。 我的示例代码: 在这种情况下,JDialog无法正确显示: inccorect出现jdialog 但它必须符合这一点: true出现jdialog 我怎样才能解决这个问题。我想让主线程等待另一个线程。有人可以纠正我的示例代码,或者在