我在接受采访时被问到这个问题 - 不确定它是否有意义。
你有几个相同优先级的线程已经启动并运行,你如何确保其中的特定线程首先运行完成?
你不能在其他线程上使用wait()和sleep()技巧..
编辑: 不允许修改其他线程。
答案 0 :(得分:6)
有一个线程join()
另一个
答案 1 :(得分:2)
由于不允许修改线程,因此必须先挂起必须先完成的线程上的等待线程和join()。
为了完整性,我将留下以下内容(我在补充修改线程的澄清之前回答),但在问题的明确限制下,这些方法将被禁止:
让每个其他线程在应该首先完成的线程上调用join()。这将导致它们等到该线程终止,但使用的时间比sleep()循环少得多。
Thread first = new FirstThread();
Thread after1 = new AfterThread(first);
Thread after2 = new AfterThread(first);
在AfterThread的运行方法中:
first.join();
// Do the rest of this thread's code
您也可以将超时传递给join()。
另一种方法可能是创建一个只有特定命名线程可以获取的锁,直到该命名线程获得并释放一次为止。
答案 2 :(得分:1)
它已被弃用并且本质上不安全(所以你永远不应该使用它),但你可以suspend()
所有其他线程,然后join()
在你想要先完成的那个线程上,然后{{1} }。
我不确定这是不是他们想要的。如果是,我会怀疑他们的面试技巧或他们的Java知识。
我能想到的“好”解决方案至少需要简单地修改线程将要运行的代码。你确定修改这些线程是不受限制的吗?