gpt4 book ai didi

Java BlockingQueue 消息线程之间的滞后问题

转载 作者:行者123 更新时间:2023-12-01 12:50:49 27 4
gpt4 key购买 nike

我已经实现了一个带有套接字线程池的两人游戏。每个玩家都连接到自己的线程。我按照this添加了一个消息队列系统文章。

问题是消息滞后。第一个玩家的第一个响应会按预期添加到 messageQueue 中。但是第二个玩家没有通过调用 poll() 收到它,它只收到 null。然后第二玩家响应第二玩家收到第一玩家的消息。我的目的是在第二位玩家做出回应之前将消息发送给他/她。

我一定是犯了一些错误,或者我忽略了一些重要的概念。

你能帮我找到它吗?

我的代码是这样的,有两个与此相关的类,GameRunnable.java和Game.java。我省略了一些代码来简化这个困惑。

在 GameRunnable 类中;

public static final Map<GamerRunnable, BlockingQueue<String>> messageQueues = new ConcurrentHashMap<>();
public static final Map<String, GamerRunnable> gameQueue = new ConcurrentHashMap<>();
private Game game;


public void run() {
System.out.println
(this.setGameInstance(clientSocket, readerIn, output) ? "OK": "FAILED");
messageQueues.put(this, new ArrayBlockingQueue<String>(100));

// If player 1
this.game.initGame(this);

// If Player 2
this.game.initGame(this);
}

public static GamerRunnable getGameThreadByName(String name) {
return gameQueue.get(name);
}

public String getName() {
return this.name;
}

在 Game.java

public Game(Socket clientSocket, BufferedReader readIn, OutputStream output) {
this.sockGamer = clientSocket;

try {
this.out = output;
this.inGamer = readIn;
} catch(Exception e) {
e.printStackTrace();
}

public void sendToGamer(String msg) {
try {
this.out.write((msg+"\n").getBytes());
this.out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public void initGame(GamerRunnable game) {
try {
boolean messageLoop = true;

String line1 = null;
String line2 = null;

while (messageLoop) {

line1 = inGamer.readLine();

if (line1 != null) {

System.out.println("Gamer says: "+line1);

GamerRunnable gamer2 = null;
if (game.getName().equals("red")) {
gamer2 = GamerRunnable.getGameThreadByName("black");
}
else if (game.getName().equals("black")) {
gamer2 = GamerRunnable.getGameThreadByName("red");
}

if (gamer2 != null) {
System.out.println("Adding to Queue");
GamerRunnable.messageQueues.get(gamer2).offer(line1);
}
}

line2 = GamerRunnable.messageQueues.get(game).poll();

if (line2 != null) {
//receiving from Queue
System.out.println(line2);
game.getGameInstance().sendToGamer(line2);
}
}

最佳答案

由于网络延迟,您可能需要短暂的延迟才能等待第一条消息到达队列。试试poll(time, unit)反而。这将等待指定的时间消息出现在队列中。如果没有任何内容,它将像现在的 poll() 一样返回 null。如果没有可用消息,用户可能不会注意到 500 毫秒到 1 秒的延迟。

关于Java BlockingQueue 消息线程之间的滞后问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com