【问题标题】:How do you ensure that a thread executes after another?你如何确保一个线程一个接一个地执行?
【发布时间】:2015-07-02 17:46:01
【问题描述】:

对不起,如果这是一个愚蠢的问题。我在一本书中找到了一个已解决的问题,但该解决方案不包含源代码。我提出了一个代码,但我不确定该代码是否符合解决方案规范。如果可能,请更正代码或提出更好的代码(欢迎解释)。感谢您的帮助。


问题:

共有三个线程 T1、T2 和 T3。 Java中如何保证T1、T2、T3的顺序?


解决方案:

多线程中的排序可以通过不同的方式实现,但是您可以简单地使用线程类的 join() 方法在另一个线程完成执行时启动一个线程。 要确保三个线程执行,您需要先启动最后一个,例如T3 然后以相反的顺序调用连接方法,例如T3调用T2.join,T2调用T1.join,这样T1先完成,T3最后完成


建议代码:

final Thread t3 = new Thread(new T3()); // assume T3 is a Runnable
final Thread t2 = new Thread(new T2());
final Thread t1 = new Thread(new T1());

t3.start();
t2.start();
t1.start();

t2.join();
t1.join();

【问题讨论】:

  • 这个问题确实不好说。如前所述,最好的答案是重新架构以仅使用单个线程,并按需要完成的顺序执行三件事。
  • 您是要确保它们以特定顺序开始,以特定顺序完成,还是按顺序开始和完成?
  • 在线程 1 的代码末尾创建线程 T2。在线程 2 的代码末尾创建线程 T3。或者只是按照建议不要打扰多个线程其他。我很确定这个愚蠢的要求无论如何都是重复的。

标签: java multithreading


【解决方案1】:

您建议的代码不起作用。 t3 甚至可以在 t2 开始之前完成。为了保证它们按顺序运行,您需要这样做:

final Thread t3 = new Thread(new T3()); // assume T3 is a Runnable
final Thread t2 = new Thread(new T2());
final Thread t1 = new Thread(new T1());

t1.start();
t1.join();
t2.start();
t2.join();
t3.start();

但是使用多个线程是没有意义和浪费的。您可以使用单个线程实现相同的效果:

new T1().run();
new T2().run();
new T3().run();

【讨论】:

  • 或者,t1 可以在 t3 开始之前完成。 (它可能不会那样发生,但 JLS 允许那样发生。)start() 这个名字有点误导:t.start() 创建新线程,并创建它可运行,但实际上并不等待新线程开始运行。
【解决方案2】:

在您的示例中,主线程将等待 t2 和 t1 的执行完成。这 3 个线程的执行顺序可能不同。 我相信您想在前一个线程的执行完成后启动每个线程。在这种情况下,我看不到使用并行性的意义。 如果您想等到多个线程的执行完成,我建议您阅读有关屏障同步的内容,尤其是此类

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多