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