Java 游戏服务器线程安全接收 Web 套接字消息



我正在将我的python websocket游戏服务器升级到Java(使用Jetty作为websockets),最近开始学习线程安全。

我的挑战是,游戏逻辑(gameRoom 实例)在主线程上运行,但服务器将接收玩家消息(例如加入游戏室的消息),并从另一个线程通知游戏逻辑。我最初(在python中-当一切都在主线程上时)只是立即处理消息(例如,在收到消息时添加播放器)。这可能会导致多个线程出现问题,因为 gameRoom 线程可能会同时将玩家添加到玩家数组中。(玩家列表最终在添加玩家=线程安全期间共享!

处理从运行在自己的线程上的 servlet 接收消息并处理这些消息而不会弄乱在主线程(不同线程)上运行的游戏的最简单方法是什么?在我的脑海中,我会想象某种单向缓冲区(例如 http://web.mit.edu/6.005/www/fa14/classes/20-queues-locks/message-passing/)来排队新消息,以便在部分逻辑期间仅由游戏室本身处理。或者有没有办法避免多线程!?*请给出你的想法,我很想听听一个比我乞丐水平更多的线程知识的人。我非常感谢所有提示/建议:) *

我花时间做了一个简单的例子来展示正在发生的事情(请忽略synax错误,为了您的方便:),我将其设置为超短):

class ServerClass {
    static GameRoomClass gameRoom;

    static void main() {
        //psuedocode start Jetty Server, this server runs in another thread, will call onServerMessage()
        jettyServer.start();
        jettyServer.onMessageCallback=(onServerMessage); //set message callback (pseudocode)
        //create game room, run on main thread
        gameRoom = GameRoomClass();
        gameRoom.runGameRoom();
    }
    //when the server gets a message from a player,
    //this will be called by the server from another thread, will affect the GameRoom
    static void onServerMessage(Message theMessage) {
        gameRoom.gotServerMessage();
    }
}
//this runs game logic
class GameRoomClass {
    ArrayList<E> players = new ArrayList<>();
    public void runGameRoom() {
        while (true) {
            //move players, run logic...
            //sometimes, may call addNewPlayer AS WELL
            if(...){
                addNewPlayer();
            }
        }
    }
    public gotServerMessage(){
        //this will only be called by the 'Server' thread, but will enter 'addNewPlayer' method
        //meaning it will access shared value players?
        addNewPlayer()
    }
    public addNewPlayer(){
        //this will be called by the server thread, on getting a message
        //can ALSO be called by gameRoom itself
        players.add(new PlayerObj());
    }
}
class PlayerObj {
    //a player in the game
}

最简单有效的方法是使用 java.util.concurrent package 中的线程安全集合类之一。对于给定的情况,ConcurrentLinkedQueue似乎是一个好的开始。

相关内容

  • 没有找到相关文章

最新更新