2013-03-21 83 views
0

我是新来的java,我想知道如何做一些我在面试问题中被问到的问题。正在按顺序运行的线程

您有三个主题T1,T2T3
你如何确保他们按顺序完成T1T2T3
采访者要求我写它的程序。
我知道这个问题可以通过joincount down latch的概念来回答,但是有些我没能成功。 请问你们可以告诉我如何去做这件事?

回答

4

创建3个线程,但不启动它们,然后转到如下

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

的Thread.join等待线程终止,所以为了保证

+0

它不会将主线程连接到这些(t1,t2和t3),而不是将t3连接到t2并将t2连接到t2。我试过了,不知何故它每次都有效。任何解释? – EMM 2014-10-06 16:41:45

0

这样做有很多种方法。最简单的办法是使用Thread.join,这将导致当前线程暂停,直到你在完成调用join()螺纹:

someThread.join(); 
// the current thread won't continue until someThread completes 

然后,你可以有T3在T2连接,而T2的T1连接。

但是如果我是你,我会问采访者为什么他们希望线程按这个顺序完成。是因为T3消耗T2产生的东西吗?如果是这样,像concurrent queue这样的东西可能会更好,因为它不那么脆弱 - 您可以更改哪个线程执行消耗或生成事物的工作,而不会中断任何事情。哎呀,生产者/消费者线程可以设置为从来没有完成,而是有一个生产尽可能快,另一个消耗尽可能快。线程全部关于而不是了解事情发生的顺序,除了某些接触点(例如准备消耗的东西)之外。

所以基本上,提出的问题有点虚假。

1

对我来说,这是一个有趣的问题。我会问面试官他为什么要他们按照特定的顺序完成。坦率地说,我看不到任何情况下,我希望单独的线程以特定的顺序完成,而不是等待它的子节点的主线程。

+0

面试官想要测试我,请告知 – user2174651 2013-03-21 08:11:27

+1

如果唯一的要求是线程完成在一个特定的orden,那么Evgeniy答案是一个可行的解决方案。然而,雇主倾向于希望员工在需求不明确或者设计解决方案低于标准时自己做出自己的想法并大声说出来。在我的书中,设计有效解决方案的能力比直接了解特定界面更重要。 javadoc中提供了一个接口的细节。学习如何编写有效的解决方案非常困难,需要经验和才能。 – 2013-03-21 13:14:17

0

如果线程按顺序完成,那么为什么不把所有三个线程的代码放在1线程的运行?