gpt4 book ai didi

Java ConcurrentLinkedQueue 行为异常

转载 作者:行者123 更新时间:2023-12-01 11:37:21 24 4
gpt4 key购买 nike

我正在开发一个项目,其中我将某些数据包添加到队列中以便稍后处理(接下来的 600 毫秒滴答处理队列中的所有数据包)。

但是,我目前遇到了麻烦,因为当在同一周期中接收到两个数据包时,队列的行为非常奇怪。

我在类名列前茅

    private ConcurrentLinkedQueue<RSPacket> logicPackets;

public LogicDecoder() {
super();
logicPackets = new ConcurrentLinkedQueue<RSPacket>();
addDecodeable(new SendWalk());
}

并添加我有的数据包

    @Override
public void decode(RSPacket packet, Session session) {
GameServer.get().logger().debug("LogicDecoder decoded " + packet.getId() + " - " + packet.getLength() + " - " + packet.getOffset());
for (RSPacket p : logicPackets) {
if (p.getId() == packet.getId()) {
logicPackets.remove(p);
GameServer.get().logger().debug("Removed packet from queue with id " + packet.getId());
break;
}
}
logicPackets.add(packet);
for (RSPacket p : logicPackets) {
GameServer.get().logger().debug("LogicDecoder containsOnDecode " + p.getId());
}
}

这是调用decode的代码,这是decodeDecodables()方法的重要部分注意:当我尝试不使用 getConvertedPacket() 时,仍然出现同样的问题

Decoder d = (Decoder) handler;
P converted = (P) d.getConvertedPacket(packet, session);
if (packet.getId() != PACKET.PING.getId()) {
GameServer.get().logger().debug(packet.getId() + " -> " + converted.getId());
}
if (d.canHandle(converted, session) && d.preDecode(converted, session)) {
d.decode(converted, session);
return true;
}

最后,这是队列的最终使用方式:

    @Override
public void onTick(Session session) {
super.onTick(session);
//GameServer.get().logger().debug("We have " + logicPackets.size() + " logicPackets to process");
for (RSPacket p : logicPackets) {
GameServer.get().logger().debug("pending packet id: " + p.getId());
}
RSPacket packet;
while ((packet = logicPackets.poll()) != null) {
//GameServer.get().logger().debug("LogicDecoder onTick Poll " + PACKET.forId(packet.getId()).name());
if (!preDecode(packet, session) || !decodeDecodeables(packet, session)) {
decodeFail(packet, session);
}
}
}

以下是当 id 为 8 的数据包和 id 为 59 的数据包连续发送时的输出。

[17:31:32] -> WorldDecoder recieved packet 8
[17:31:32] -> 8 -> 8
[17:31:32] -> LogicDecoder decoded 8 - 21 - 2
[17:31:32] -> LogicDecoder containsOnDecode 8
[17:31:32] -> WorldDecoder recieved packet 59
[17:31:32] -> 59 -> 59
[17:31:32] -> LogicDecoder decoded 59 - 21 - 12
[17:31:32] -> Removed packet from queue with id 59
[17:31:32] -> LogicDecoder containsOnDecode 59

正如你所看到的,第一遍很好,它将数据包 8 添加到队列中,然后当为数据包 59 再次调用该函数时,它决定我们之前添加的数据包(数据包 8)现在是数据包 59 并且在添加自身之前将其删除。老实说,我不知道这里发生了什么。

最佳答案

通过更改数据包类以实现 Cloneable,我能够修复此问题:

logicPackets.add(packet);

对此:

 logicPackets.add((RSPacket)packet.clone());

关于Java ConcurrentLinkedQueue 行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834853/

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