Java : 如何 return 来自线程的中间结果
Java : How to return intermediate results from a Thread
使用Java 7
我正在尝试构建一个监视数据存储(某种集合类型)的观察者,然后 return 在某些时候从中获取某些项目。
在这种情况下,它们是时间戳,当时间戳超过当前时间时,我希望它被 returned 到起始线程。请看下面的代码。
@Override
public void run() {
while (!data.isEmpty()) {
for (LocalTime dataTime : data) {
if (new LocalTime().isAfter(dataTime)) {
// return a result but continue running
}
}
}
}
我读过有关 future 和 callables 的内容,但它们似乎在 return 上停止了线程。
我不是特别想要 return 一个值并停止线程然后在使用可调用的情况下启动另一个任务,除非这是最好的方法。
查找此内容的最佳技术是什么?似乎有如此广泛的范围。
谢谢
您可以将中间结果放在 Blocking Queue 中,以便在结果可用时可供消费者线程使用:
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);
}
}
}
}
public Result takeResult() {
return results.take();
}
消费者线程可以简单地调用takeResult
方法来使用中间结果。使用 Blocking Queue 的优点是您不必重新发明轮子,因为这看起来像典型的生产者-消费者场景,可以使用阻塞数据结构来解决。
注意这里,Result
可以是表示中间结果对象的`POJO。
你走在正确的道路上。假设适当的同步将在那里,并且您将按时获得所有时间戳 :) 理想情况下,您应该选择一种不需要扫描所有项目的数据结构。选择最小堆或一些 ascending/descending 列表之类的东西,现在当您迭代时,只需从此数据存储中删除元素并将其放入阻塞队列。有一个线程正在侦听此队列以进一步处理。
使用Java 7 我正在尝试构建一个监视数据存储(某种集合类型)的观察者,然后 return 在某些时候从中获取某些项目。 在这种情况下,它们是时间戳,当时间戳超过当前时间时,我希望它被 returned 到起始线程。请看下面的代码。
@Override
public void run() {
while (!data.isEmpty()) {
for (LocalTime dataTime : data) {
if (new LocalTime().isAfter(dataTime)) {
// return a result but continue running
}
}
}
}
我读过有关 future 和 callables 的内容,但它们似乎在 return 上停止了线程。
我不是特别想要 return 一个值并停止线程然后在使用可调用的情况下启动另一个任务,除非这是最好的方法。
查找此内容的最佳技术是什么?似乎有如此广泛的范围。
谢谢
您可以将中间结果放在 Blocking Queue 中,以便在结果可用时可供消费者线程使用:
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);
}
}
}
}
public Result takeResult() {
return results.take();
}
消费者线程可以简单地调用takeResult
方法来使用中间结果。使用 Blocking Queue 的优点是您不必重新发明轮子,因为这看起来像典型的生产者-消费者场景,可以使用阻塞数据结构来解决。
注意这里,Result
可以是表示中间结果对象的`POJO。
你走在正确的道路上。假设适当的同步将在那里,并且您将按时获得所有时间戳 :) 理想情况下,您应该选择一种不需要扫描所有项目的数据结构。选择最小堆或一些 ascending/descending 列表之类的东西,现在当您迭代时,只需从此数据存储中删除元素并将其放入阻塞队列。有一个线程正在侦听此队列以进一步处理。