gpt4 book ai didi

java - 在多个线程上同步Java中的队列

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:40 25 4
gpt4 key购买 nike

我理解同步的概念,但我现在确定为什么要以这种方式实现它,所以我需要一些帮助:

我有 2 个线程:

PeriodicalThread 将定期接收数据(假设每 5 秒)并将其放入 Queue(暂时使用 ArrayDeque,但是我不知道是否还有其他 Queue 实现会更好)

ProccessThread 会不断检查 Queue 是否为空。如果它不为空,它将处理数据(FIFO)

所以,一开始我的实现是:

// Both threads are inner class so they have access to Queue

private Queue queue;
private boolean isReadyToProccess;


class PeriodicalThread extends Thread {
public void run() {
while(true) {
if(isNewDataAvailable) {
// create Data object
queue.add(data);
}
}
}
}

class ProcessThread extends Thread {
public void run() {
while(true) {
if(!queue.isEmpty() && isReadyToProccess) {
Data data = queue.poll();
processData(data);
}
}
}
}

private void processData(Data data) {
// this method send data over network, and the server response callback
// changes isReadyToProcess value to true.
}

然后当想要处理同步时,我不知道我是否应该使用lock对象(以及它是如何实现的)或者是否已经有一个包Queue 实现是线程安全的(因为 add()poll() 方法)

编辑:我忘记了标志 isReadyToProcess 指示下一个队列 Data 对象是......好吧,准备好被处理。此标志也应同步。

最佳答案

ArrayDeque 不支持并发。相反,使用支持并发工作的真实队列,如 BlockingQueue及其在 java.util.concurrent 包中的实现之一。我建议使用 LinkedBlockingQueue .

如果您需要在线程之间共享标志,最好使用 AtomicBoolean而不是手动同步原始 boolean 字段。

注意:如果您将使用并发进程,最好使用java.util.concurrent 提供的类。已经支持开箱即用的锁定和同步的软件包。

关于java - 在多个线程上同步Java中的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085571/

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