对于我的家庭作业,我必须制作一个由几个国王在棋盘上移动的游戏。每个国王必须在自己的线程中从其独特的起始位置移动到独特的结束位置。在采取行动之前,国王必须 hibernate 长达 10 毫秒(有点随机性),然后等待其他人采取行动。
我已经用CyclicBarrier
解决了国王等待对方采取行动的问题,但是当其中一个国王到达他的结束位置从而停止他自己的线程时,问题就出现了。然后,CyclicBarrier
等待线程调用 wait() 方法,但这永远不会发生,因为线程不再运行。
有什么建议吗?
最佳答案
是的。使用Phaser Java 7 附带的。它是一个先进的 CycliclBarrier。
要直接模仿 CyclicBarrier,您可以通过这种方式使用 Phaser。
Phaser phaser = new Phaser(n);
public void doWorkAndAwait(){
//work
phaser.arriveAndAwaitAdvance(); //await for all threads to arrive
}
如果您想通知 Phaser 您已到达但不等待提前,您只需 arrive()
public void doWorkAndContinue(){
//work
phaser.arrive();
//stop own thread
}
此时,Phaser 已收到线程已到达的通知,但该线程可以停止自己的线程
,而无需等待其他线程到达。
关于java - 从 CyclicBarrier 中排除特定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10949272/