我有一个 java / blazeds 应用程序,它保留一个数组“ _games ”,这是 2 个订阅相同 blazeds 主题的玩家。我看到的问题是只有不到 40% 的连接尝试成功,到目前为止,我调试问题的努力没有成功——它似乎是无声无息地抛出,而且行为是随机的,除了第一对连接似乎比随后的尝试。我看到了ConcurrentModificationException并且我在该主题上阅读的内容表明我的代码存在并发问题。
在这种情况下,我在线程内迭代数组“_games”,我想知道如何安全地执行此操作,因为其他客户端将尝试随机访问此变量。
更新#2:
在调试线程内的 for 循环时,似乎当前项目始终相同,因此迭代器不会前进或被后续请求重置,因此 i 始终 = 0 ,或者如果使用 for(Game g : _games) ,那么 g 始终是数组中的第一项。
谢谢!
public class GameService {
private static List<Game> _games;
private static GameServiceThread thread;
public GameService(MessageTemplate template) {
this.template = template;
}
public Game CreateOrJoinGame(GamePlayer player)
{
Game currentGame = new Game();
boolean isFull = false;
for (Game g: _games)
{
ArrayCollection myCollection = g.myCollection;
currentGame = g;
if(!g.IsFull())
{
myCollection.add(player);
if(g.IsFull())
{
isFull = true;
currentGame.myCollection = myCollection;
System.out.print("User Count..." + myCollection.size() + "\n");
}
break;
}
}
if(isFull)
{
return currentGame;
}
else
{
Game creator = CreateGame(player);
return creator;
}
}
public void start() {
if (thread == null) {
if(_games == null)
{
_games = new ArrayList<Game>();
}
thread = new GameServiceThread(this.template);
thread.start();
}
}
public void AddPlayer(GamePlayer player)
{
_allPlayers.add(player);
}
//嵌套的静态线程类
public static class GameServiceThread extends Thread {
@Override
public void run() {
this.running = true;
while (this.running)
{
for (Game g: _games)
{
//do work
}
}
}
private void sendGameUpdate(final Game game) {}
该服务在 flex-servlet 中注册仅供参考,尽管我认为这不是我的问题。
<bean id="gameFeedService" class="com.acme.services.GameService">
<constructor-arg ref="defaultMessageTemplate" />
<flex:remoting-destination />
</bean>
编辑:添加了一些关于如何添加新游戏的代码。我在 GameService 类和 GameServiceThread 中迭代了 _games。首先,当新客户端向服务发送远程游戏对象时,我在同一个集合中进行迭代以向每个游戏接收者发送一条消息。每个游戏内部都有一个集合,我用它来确定游戏是否已满 - 如果它是一个新的 Game() 被创建。