对于我的作业,我必须让几个国王的游戏在棋盘上移动。每个国王必须在自己的线索中从他独特的起点移动到独特的结局位置。在移动之前,国王必须睡眠长达10毫秒(有点随机),然后等待其他人移动。
我已经解决了国王等待彼此用CyclicBarrier
进行移动的问题,但是当其中一个国王到达他的结局位置从而停止他自己的线程时,问题就出现了。然后CyclicBarrier
正在等待线程调用await()方法,但由于线程不再运行,因此永远不会发生。
有什么建议吗?
答案 0 :(得分:1)
是。使用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
,而无需等待其他线程到达。