有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确保线程一个接一个地执行?

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


问题:

有三条线T1、T2和T3。如何确保Java中的序列T1、T2、T3


解决方案:

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

共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    你提议的代码行不通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();