【发布时间】:2023-03-08 14:20:02
【问题描述】:
当使用 BlockingQueue 来消费产生的数据时,等待数据出现的最有效方法是什么?
场景:
步骤 1) 数据列表将是一个添加时间戳的数据存储。这些时间戳需要按照最接近当前时间的优先级排序。此列表可能为空。一个线程将在其中插入时间戳。 制作
第 2 步) 我想在另一个线程中使用此处的数据,该线程将从数据中获取时间戳并检查它们是否在当前时间之后。 消费者然后生产
步骤 3) 如果它们在当前时间之后,则将它们发送到另一个线程以供使用和处理。在此处处理时间戳数据后,从步骤 1 数据存储中删除。 使用然后编辑原始列表。
在下面的代码中,数据字段是指步骤 1 中的数据存储。 结果是当前时间之后已发送的时间戳列表。第2步。 然后将在步骤 3 中使用结果。
private BlockingQueue<LocalTime> data;
private final LinkedBlockingQueue<Result> results = new LinkedBlockingQueue<Result>();
@Override
public void run() {
while (!data.isEmpty()) {
for (LocalTime dataTime : data) {
if (new LocalTime().isAfter(dataTime)) {
results.put(result);
}
}
}
}
问题 等待数据添加到可能为空的数据列表中的最有效方法是什么?关注:
while (!data.isEmpty())
继之前的question.
【问题讨论】:
-
使用
data.take()!=null。isEmpty调用是非阻塞的。 -
是的,如果你要轮询,那么使用阻塞队列有什么意义呢?
-
您的代码显示
!data.isEmpty(),这意味着您正在循环直到数据列表中有一些数据(等待数据被使用)。但是您的要求是 - “等待数据被添加在数据列表中可能是空的。”您在这里有什么要求? -
@hagrawal 我添加了更多上下文
-
所以你的意思是你想等待从
results.put(result);产生数据??我认为这将是最初的案例。一旦产生了一些数据会发生什么。根据第 3 步,您希望它被某个线程消耗,假设产生了 1 个数据,并且它被消耗了,现在同样的线程将再次等待下一个项目的产生?关键是-等待从results.put(result);生成数据的同一线程还是不同的线程,或者线程将继续消耗,但如果数据不存在,那么它应该等待吗?单线程或多线程部分不清楚。
标签: java multithreading java-7 producer-consumer blockingqueue