你如何确保一个又一个的线程执行?

时间:2015-07-02 17:46:01

标签: java multithreading

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

问题:

有三个线程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();

2 个答案:

答案 0 :(得分:4)

您提出的代码无效。 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();

答案 1 :(得分:1)

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

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