2011-11-12 274 views
4

我在一次采访中被问到这个问题 - 不确定它是否有意义。单线程执行完成

你有几个线程相同的优先级开始和运行,你如何确保其中一个特定的线程先运行到完成?

不能使用wait()和睡眠()招对其他线程..

编辑: 修改其他线程是不允许的。

+0

是否在线程中将setpriority()设置为max的规则? – dbjohn

+0

@dbjohn - 不能改变优先级 –

+1

@dbjohn改变优先级并不能保证任何东西。 –

回答

1

它过时,本身就是不安全的(所以你不应该使用它),但你可以suspend()所有其他线程,然后join()你想获得第一,然后resume()之一。

我不确定这是他们要做什么。如果是这样,我会怀疑他们的面试技巧或他们的Java知识。

我能想到的“好”解决方案至少需要修改线程将要运行的代码。您确定修改这些线程的限制吗?

+0

是的。如果我说得对,这个问题的形成方式就是禁止修改线程。我被给了一个暗示,如果我能从JVM的角度做任何事情。 –

+0

@johnbk,任何你可以从“JVM视角”改变的东西都需要改变或添加代码。 –

6

有一个线程join()其他

+0

这将需要修改您尝试控制的线程。 –

+2

它只需要改变等待线程的代码。 –

2

因为你是不允许修改的线程,你将不得不暂停等待的线程和join()的线程必须首先完成。


我会留下以下的完整性(我澄清有关修改线程加入之前回答),但在这个问题的明确限制,这些方法将被禁止:

有各其他线程在首先完成的线程上调用join()。这将导致他们等待该线程终止,但使用比sleep()循环少得多的CPU时间。

Thread first = new FirstThread(); 
Thread after1 = new AfterThread(first); 
Thread after2 = new AfterThread(first); 

在为AfterThread run方法:

first.join(); 
// Do the rest of this thread's code 

您也可以通过超时加入()。

另一种方法可能是创建一个只有特定命名线程才能获取的锁,直到该命名线程获取并释放一次之后。

相关问题