对于我的作业,我必须做一个游戏,让几个国王在棋盘上移动。每个国王必须在自己的线程中从他独特的开始位置移动到独特的结束位置。在采取行动之前,国王必须睡最多 10 毫秒(有点随机),然后等待其他人采取行动。
我已经解决了国王等待对方采取行动CyclicBarrier
的问题,但是当其中一个国王到达他的结束位置从而停止他自己的线程时,问题就出现了。然后CyclicBarrier
等待线程调用 await() 方法,但这永远不会发生,因为线程不再运行。
有什么建议么?
对于我的作业,我必须做一个游戏,让几个国王在棋盘上移动。每个国王必须在自己的线程中从他独特的开始位置移动到独特的结束位置。在采取行动之前,国王必须睡最多 10 毫秒(有点随机),然后等待其他人采取行动。
我已经解决了国王等待对方采取行动CyclicBarrier
的问题,但是当其中一个国王到达他的结束位置从而停止他自己的线程时,问题就出现了。然后CyclicBarrier
等待线程调用 await() 方法,但这永远不会发生,因为线程不再运行。
有什么建议么?
是的。使用 Java 7 附带的Phaser。它是一种先进的 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 已被通知线程已到达,但该线程stop own thread
无需等待其他线程到达即可。