使用Java 7我正在尝试构建一个监视数据存储(某些集合类型)的观察程序,然后在某些点从其中返回某些项目。
在本例中,它们是时间戳,当时间戳经过当前时间时,我希望将其返回到起始线程。请参阅下面的代码。
@Override
public void run() {
while (!data.isEmpty()) {
for (LocalTime dataTime : data) {
if (new LocalTime().isAfter(dataTime)) {
// return a result but continue running
}
}
}
}
我读过有关 future 和 callables 的内容,但它们似乎在返回时停止线程。
如果使用可调用,我并不是特别想返回一个值并停止线程然后启动另一个任务,除非这是最好的方法。
寻找此问题的最佳技术是什么?这样做的范围似乎很广。
Thanks
您可以将中间结果放入阻塞队列 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html以便消费者线程在结果可用时即可使用结果:
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
使用中间结果的方法。使用的优点阻塞队列是你不必重新发明轮子,因为这看起来像一个典型的生产者-消费者场景,可以使用阻塞数据结构来解决。
Note Here, Result
可以是一个`POJO表示中间结果对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)