被處理室和用戶在隊列中,單獨運行的線程來接2名玩家客戶端發起搜索請求Smartfoxserver2x處理響應同步
後,下面是我真的很concered約而不太瞭解情況wheather與否我在正確的道路
可以說玩家A和玩家B發送搜索請求Lobby_1房間。 這兩個User對象都被添加到已經映射到Room(Looby_1)的的ConcurrentLinkedQueue中,因此條件「if( queueSize> = 2)」滿足並且它即將調用onSearchSuccess 發送播放器A和播放器B的遊戲對象作爲參數。由於 這是獨立的線程一直在同時運行,可以說 玩家A在此函數調用前退出/斷開 「lobby.onSearchSuccess(player1,player2);」因爲玩家A 在執行onSearchSuccess on Lobby之前發生斷開連接, 玩家A收到搜索成功並等待遊戲永遠開始 。如果onSearchSuccess執行第一,然後斷開,我 可以讓玩家A知道,球員B斷開
是增加房和用戶對象集合對象和處理 他們一個單獨的線程中建議?這樣做有沒有問題 ?
我希望我做了清楚我的問題。
如何解決這個問題。我不認爲在多人遊戲中引入同步方式不正確
public void run() {
if(!isRunning()) {
setRunning(true);
}
while(isRunning()) {
for(Map.Entry<Room, ConcurrentLinkedQueue<User>> entry : LOBBY_MAP.entrySet()) {
Room room = entry.getKey();
ConcurrentLinkedQueue<User> queue = entry.getValue();
//check queue size
int queueSize = queue.size();
//minimum queue size must be 2 or greater than 2
if (queueSize >= 2) {
logger.debug("QUEUE SIZE: " + queueSize);
User player1 = queue.poll();
User player2 = queue.poll();
//check if both players are not null
if(player1 != null && player2 != null) {
Lobby lobby = (Lobby) room.getExtension();
lobby.onSearchSuccess(player1, player2);
}
}
}
}
}
public class UserDisconnectHandler extends BaseServerEventHandler {
public void handleServerEvent(ISFSEvent isfse) throws SFSException {
if(isfse.getType() == SFSEventType.USER_DISCONNECT) {
User user = (User) isfse.getParameter(SFSEventParam.USER);
List<Room> rooms = (List<Room>) isfse.getParameter(SFSEventParam.JOINED_ROOMS);
if(rooms != null) {
for(Room room : rooms) {
if(!room.isGame()) {
SearchWorker.getInstance().removeUser(room, user);
//handle users qualified after search success
}
}
}
}
}
}