【发布时间】:2014-12-07 13:39:28
【问题描述】:
每个人。我正在为一个编程课程做一个游戏,该课程由两条沿相反方向行走的蛇组成。他们需要阻止 障碍,我使用协调使他们不会相互对抗。这意味着第二个尝试访问单元的人将需要等到第一个解除对单元的阻塞。我已经在这个网站上阅读了很多主题,但我仍然没有找到解决问题的方法。
现在我已经让蛇在棋盘周围移动并挡住了障碍物。我感谢任何帮助的两个大问题如下:
1- 有特定的情况,例如,两条蛇平行行走,当它们试图将方向转向另一条蛇时,它们都会阻挡并游戏 停在那里,导致死锁。只有一个可以停止,而另一个等待第一个解锁单元格。我仍然没有找到特定问题的解决方案。如果它们不碰撞 在每一个的方向上,都没有问题。一条蛇等待另一条清除细胞。我已经在这里阅读了有关使用 CountDownLatch 的解决方案,但不知道如何实现它。
2 当蛇在障碍物中阻塞时,继续等待()。然后我让她再次点击棋盘的一个单元格,蛇需要重新计算一种新的方式去我点击的单元格。这意味着我需要将运动从随机更改为特定的。老师让我们中断线程,让她离开她正在做的方法(moveNextCell())并重新计算下一个动作。 这里的问题是我可以处理中断但不知道如何再次激活线程。我读了它,不知道我是否解释得不好,在一个线程中断后,我无法再次启动它,所以我需要复制它。但现在我不知道如何在我的代码中做到这一点,因为新线程需要蛇的实际位置、颜色等。
现在我不能同时做这两种情况。
单元格代码(在有障碍物或一条蛇想使用另一个单元格的情况下阻止蛇)如下:
公共同步无效reserveCell(Snake snakeID){ 这个 .snakeID = snakeID ;
while (type .equals("Barrier" )){
try {
wait();
} catch (InterruptedException e ) {
// When snake it's blocked and we interrupt it, comes to this part!
Thread. currentThread().interrupt();
snakeID.doSpecificMovement();
}
}
while (inUse ){
try {
wait();
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
setSnakeID( snakeID);
inUse = true ;
}
蛇代码(使其移动)如下:
公共无效运行(){ while(!Thread.currentThread().isInterrupted()){ moveNextCell(currentX, currentY); // 询问下一个单元格,如果可能,将单元格添加到蛇的主体并更新 GUI 设置随机方向(); // 定义下一步移动的方向。
try {
sleep(gameSpeed);
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
gameOver(); // when the snakes reachs the end of the board finishs
}
}
如果能帮助我在工作中取得进步,我将不胜感激。感谢您的帮助!
【问题讨论】:
-
使用线程是您要求的一部分吗?看起来它作为一个单线程程序会简单得多。
-
Banthar,首先感谢您的帮助。不幸的是,它是一个协调和同步类,所以它们迫使我们使用多个线程!
标签: java multithreading deadlock