【问题标题】:Exclude a specific thread from CyclicBarrier从 CyclicBarrier 中排除特定线程
【发布时间】:2012-06-08 12:54:16
【问题描述】:

为了我的家庭作业,我必须制作一个游戏,让几位国王在棋盘上移动。每个国王必须在自己的线程中从他独特的开始位置移动到独特的结束位置。在下棋之前,国王必须睡最多 10 毫秒(有点随机),然后等待其他人下棋。

我已经用CyclicBarrier 解决了国王互相等待行动的问题,但是当其中一个国王到达他的结束位置从而停止他自己的线程时,问题就出现了。然后CyclicBarrier 正在等待线程调用 await() 方法,但由于线程不再运行,因此这种情况永远不会发生。

有什么建议吗?

【问题讨论】:

  • 没有办法直接用 java.util.concurrent.CyclicBarrier 类完成你想要的。但是,您也许可以调整国王的逻辑,以便 CyclicBarrier 仍然可以帮助您。
  • 您是否考虑过使用其他方法创建CyclicBarrier 的子类- 或许gone 是合适的- 它只是生成一个线程,该线程仅通过await 接管退出线程的功能循环吗?这当然是我的处理方式。

标签: java multithreading cyclicbarrier


【解决方案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而无需等待其他线程到达。

【讨论】:

  • 谢谢。我来看看 Phaser 类。我看到的唯一问题是它是在 Java 7 中引入的。不幸的是,我认为我们的助手仍然使用 Java 6。
  • 没问题。真可惜,这将完全满足您的需求。
猜你喜欢
  • 2013-07-15
  • 2014-08-23
  • 1970-01-01
  • 2014-06-22
  • 2014-07-29
  • 2016-08-15
  • 2017-06-23
  • 2020-06-25
  • 2014-07-10
相关资源
最近更新 更多