gpt4 book ai didi

java - ConcurrentLinkedQueue 未按预期工作

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

我正在开发一个 Andoid 应用程序,它由在后台运行的服务和连接到该服务的一些 Activity 组成。该服务在它自己的进程上运行。

我的Service主要有3个类:ServiceMain、ServiceWorker、Message。

ServiceMain 具有 Activity 使用的所有功能,如登录、注销、发送...等。

消息表示发送到我们的服务器或收到的消息。只是一个字符串和一个 boolean 值,其中字符串是消息, boolean 值是一个标志,表示是否需要服务器的响应。

ServiceWorker 是 Thread 的子类,使用 Socket 完成所有消息的发送和接收。

ServiceMain 包含 2 个队列:

Queue<Message> Sendingqueue= new ConcurrentLinkedQueue<Message>(); 
Queue<Message> Recievequeue = new ConcurrentLinkedQueue<Message>();

如果调用 logIn 方法,则会创建并启动 ServiceWorker。在它的构造函数中,它获取对两个队列的引用并保存它们。

private final Queue<Message> Sendingqueue;
private final Queue<Message> Recievequeue;

ServiceMain 然后创建一些消息(例如 M1、M2)并将它们添加到 Sendingqueue。

ServiceWorker 建立与我们服务器的连接,然后进入一个循环,在 Sendingqueue 中查找消息、发送消息并执行一些其他操作,例如接收......

希望现在情况已经清楚。

在 ServiceWorker 中,Sendingqueue 上发生了一些奇怪的事情:

假设 ServiceMain 添加了两条消息 M1 和 M2 到 Sendingqueue,而 ServiceWorker 正在做一些耗时的事情或者没有连接到我们的服务器。Sendingqueue 现在包含两条消息。

如果 ServiceWorker 下次获取队列的长度,它会看到 2 个项目。到目前为止还好。然后它在 Sendingqueue 上调用 peek()(只有成功发送消息才会被删除),并且应该得到 M1,因为它是先添加的。但它得到了M2。Sendingqueue 似乎已恢复。

这里出了什么问题?我该怎么做才能避免这种情况?

感谢您的建设性回复。

德特勒夫

最佳答案

ConcurrentLinkedQueue 不对顺序做出任何保证,但如果您添加到末尾并从开头获取(反之亦然),则元素的顺序不应改变。如果从开头或结尾添加和删除,您可能会遇到问题,因为这意味着您每次都处理最新的而不是最旧的。

如果你有一个强大的大型服务器,我仍然建议这种方法是多余的。我不会使用后台线程来执行处理,而是使用主线程。

注意:套接字已经是客户端和服务器上的输入和输出队列,因此添加第三层队列在大型系统中可能是多余的,而在较小的设备中效率较低。

关于java - ConcurrentLinkedQueue 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9616494/

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