我在一次采访中被问到这个问题 - 不确定它是否有意义。单线程执行完成
你有几个线程相同的优先级开始和运行,你如何确保其中一个特定的线程先运行到完成?
您不能使用wait()和睡眠()招对其他线程..
编辑: 修改其他线程是不允许的。
我在一次采访中被问到这个问题 - 不确定它是否有意义。单线程执行完成
你有几个线程相同的优先级开始和运行,你如何确保其中一个特定的线程先运行到完成?
您不能使用wait()和睡眠()招对其他线程..
编辑: 修改其他线程是不允许的。
它过时,本身就是不安全的(所以你不应该使用它),但你可以suspend()
所有其他线程,然后join()
你想获得第一,然后resume()
之一。
我不确定这是他们要做什么。如果是这样,我会怀疑他们的面试技巧或他们的Java知识。
我能想到的“好”解决方案至少需要修改线程将要运行的代码。您确定修改这些线程的限制吗?
是的。如果我说得对,这个问题的形成方式就是禁止修改线程。我被给了一个暗示,如果我能从JVM的角度做任何事情。 –
@johnbk,任何你可以从“JVM视角”改变的东西都需要改变或添加代码。 –
有一个线程join()
其他
这将需要修改您尝试控制的线程。 –
它只需要改变等待线程的代码。 –
因为你是不允许修改的线程,你将不得不暂停等待的线程和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
您也可以通过超时加入()。
另一种方法可能是创建一个只有特定命名线程才能获取的锁,直到该命名线程获取并释放一次之后。
是否在线程中将setpriority()设置为max的规则? – dbjohn
@dbjohn - 不能改变优先级 –
@dbjohn改变优先级并不能保证任何东西。 –