我在大学的 PacMan 游戏中工作,基本上我必须制作自己的 CyclicBarrier,因为我不能使用 Java 中的 CyclicBarrier 库。当幽灵到达特定位置(GhostGoal)时,此屏障将用于保留幽灵,并且他们必须等待更多幽灵,直到我的 CyclicBarrier 的构造函数中给出的最大幽灵。Ghosts 对象实现了可运行(线程)。
我以这种方式构建我的 CyclicBarrier:
public class Barreira {
private int num_threads;
private int count;
public Barreira(int num_threads) {
this.num_threads=num_threads;
}
public synchronized void await() {
while(count < num_threads) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
}
public synchronized void adiciona() {
count+=1;
}
public int getNumThreadsNaBarreira() {
return count;
}
public synchronized void reset() {
count=0;
}
}
而我调用屏障的代码(在用名称 barreira 初始化它之后)以这种方式位于这个空白中:
public synchronized void arrivePosition(){
...
if((Object)floor[y][x] instanceof GhostGoal && entity instanceof Ghost ) {
barreira.adiciona();
barreira.await();
}
}
但是,当一个幽灵到达该位置时,所有幽灵都停止移动,不仅是该位置的幽灵......基本上一切都冻结了,因为我的屏障中的等待称为barreira。
任何人都可以帮忙吗?
非常感谢。
我也在考虑这个解决方案(删除等待方法并仅使用 adiciona 方法:
public class Barreira {
...
private List <Ghost> barreiraGhosts = new ArrayList<Ghost>();
public synchronized void adiciona(Ghost g) { //teste
while(contador <num_threads) {
try {
contador+=1;
barreiraGhosts.add(g);
g.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notifyAll();
for(Ghost b: barreiraGhosts)
b.run();
reset();
}
}
public synchronized void arrivePosition(){
...
if((Object)floor[y][x] instanceof GhostGoal && entity instanceof Ghost ) {
barreira.adiciona(entity);
}
}
什么是最好的解决方案?