- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个项目,其中我将某些数据包添加到队列中以便稍后处理(接下来的 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/
我在迭代时更新ConcurrentLinkedQueue。理论上,该队列上的迭代器在到达队列末尾之前不应停止。但是,在我的程序中(如下所示),迭代器在迭代队列的初始状态(没有更新)后停止。我应该怎样解
假设我有 ConcurrentLinkedQueue 类型的类字段。此类的一些方法向该队列提供新元素。还有一些其他方法需要轮询此时队列中的所有元素。 我无法在循环中使用poll(),因为在循环尚未完成
作为我项目的一部分,我需要创建一个包含固定数量线程的线程池。每当线程分配给不同的进程时,我也需要与线程一起分配那么多 session 。我想使用 ConcurrentLinkedQueue (固定大小
我正在开发一个项目,其中我将某些数据包添加到队列中以便稍后处理(接下来的 600 毫秒滴答处理队列中的所有数据包)。 但是,我目前遇到了麻烦,因为当在同一周期中接收到两个数据包时,队列的行为非常奇怪。
我正在开发一个 Andoid 应用程序,它由在后台运行的服务和连接到该服务的一些 Activity 组成。该服务在它自己的进程上运行。 我的Service主要有3个类:ServiceMain、Serv
您能否澄清一下,我们是否需要使用显式同步或锁来使用 ConcurrentLinkedQueue?我特别想知道以下 ConcurrentLinkedQueue 方法是否需要同步调用。 添加 清除 尺寸
当前正在 for 循环中处理的元素是队列的头部吗? private Queue users = new ConcurrentLinkedQueue(); for(User u : users){
我想知道在什么情况下 ConcurrentLinkedQueue 无法从其集合中删除元素。该项目存在,它在集合内但调用 SomeConcurrentLinkedQueue.remove(item) 不
我想实现一个监视器队列,两个不相关的线程可以共享它的附加内容。在这种情况下,仅使用 ConcurrentLinkedQueue 就足够了,还是我应该采取不同的做法?我想实现 Activity 对象设计
我想使用 ConcurrentLinkedQueue在原子中lock-free方式: 多个并发线程将事件插入队列,其他线程将处理它们。队列未绑定(bind),我不希望任何线程等待或被锁定。然而,阅读部
阅读 Java's ConcurrentLinkedQueue Docs ,我想知道为什么实现无法存储大小: Beware that, unlike in most collections, the
我想使用 java.util.ConcurrentLinkedQueue 作为 Servlet 的非持久队列。这是该类(class)的 javadoc 中的简介。 An unbounded threa
如何在 Java 中使用 ConcurrentLinkedQueue? 使用这个LinkedQueue,我需要担心队列中的并发吗?还是我只需要定义两个方法(一个从列表中检索元素,另一个将元素添加到列表
当我们使用诸如 ConcurrentLinkedQueue 甚至一些 BlockingQueue 之类的内置队列之一时,单个调用是原子的并且保证是线程安全的。 但是当对 API 的 5 次调用中,有
我有一个工作线程,它应该迭代 ArrayList 。其他线程可以添加和删除对象(队列)。但ArrayList不是线程安全的。使用 ConcurrentLinkedQueue 可以吗?而不是ArrayL
我有以下代码: Queue localMsgQueue; //inside the constructor localMsgQueue = new ConcurrentLinkedQueue(); p
我广泛使用 ConcurrentLinkedQueue 进行多消耗任务排队,以前从未遇到过此问题。场景如下: 用一些任务填充我的队列 运行多个线程(在本例中为 2 个),这些线程将从队列中池化任务 当
我的线程永远运行并在 ConcurrentLinkedQueue#peek() 之后调用 ConcurrentLinkedQueue#poll()。 但在某些情况下,线程似乎挂起。我知道这有点含糊但是
我目前正在开发一个 Java 项目,该项目在原始数据包通过网络时对其进行处理。数据由libpcap读入,然后每个数据包放入一个byte[],然后放入一个ConcurrentLinkedQueue,线程
使用ConcurrentLinkedQueue时出现以下错误: Error : local variables referenced from a lambda expression must be
我是一名优秀的程序员,十分优秀!