java - 从 CyclicBarrier 中排除特定线程

标签 java multithreading cyclicbarrier

对于我的家庭作业,我必须制作一个由几个国王在棋盘上移动的游戏。每个国王必须在自己的线程中从其独特的起始位置移动到独特的结束位置。在采取行动之前,国王必须 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/

相关文章:

java - 从命令行运行时将 jar 添加到类路径

java - Activity 生成一个线程,但随后该 Activity 被销毁,或者在子线程完成之前创建一个新 Activity (在同一任务中)

python - 两个线程,一个对象

java - CyclicBarrier 的可见性同步?

java - 根据邻居的值更新多线程单元。如何继续使用 CyclicBarrier?

java - 在 Maven 中,模块是否受存储库的 updatePolicy 影响?

java - 如何在 JAVA 中获取我的 ldapsearch 中的所有 dn

java - 使用 vararg 调用 Java 函数未在 Kotlin 中编译

java - HashMap在并发访问中挂起

java - n 个线程的循环屏障也可以处理 n*2 个线程