【发布时间】:2014-03-02 01:38:58
【问题描述】:
我正在制作一个控制台游戏,其中用户通过 telnet 连接到服务器,并且在看到特定数字时必须按空格键。 每个客户端连接都有一个线程。 我正在询问最佳实践解决方案,以确定哪个客户端是第一个按空格键的。 目前我正在这样做:
public class Player {
public Socket socket;
public PrintWriter output;
public BufferedReader input;
public Player opponent;
public boolean isPlaying;
这就是玩家所知道的一切。
在我拥有的客户端线程的run 方法中:
while (player.isPlaying == true && player.opponent.isPlaying == true)
{
player.isPlaying = listenAnswers();
}
player.socket.close();
player.opponent.socket.close();
我在 listenAnswers 方法中有这个:
int answer = view.receiveAnswer(player);
if (answer == model.getWinningAction() )
{
view.sendWinMessage(player, isWinConditionMet);
view.sendLoseMessage(player.opponent, isWinConditionMet);
player.opponent.isPlaying = false;
return false;
}
receiveAnswer 方法基本上只返回player.input.read();
当我运行我的服务器时,将客户端连接到它,其中一个按下空格键一切看起来都不错,但是在receiveAnswer 方法中执行read 时,我在第二个客户端线程中成为异常。当然我可以忽略它,但我认为应该有更好的解决方案,我正在寻求它们。
基本上我在获胜线程中完成了所有工作,但是当每个客户只为自己做某事时,是否有可能?赢家写赢信息,输家写输信息。
【问题讨论】:
-
任何时候您从另一个线程访问一个线程中的信息,都必须进行内存同步。在这种情况下,您需要使
isPlaying至少为volatile。如果有测试/设置操作,您可能想使用AtomicBoolean。
标签: java multithreading