Java:如何从Thread返回中间结果

时间:2015-07-24 08:25:19

标签: java multithreading java-7 monitor callable

使用Java 7 我正在尝试构建一个观察数据存储(某些集合类型)的观察者,然后在某些点返回某些项目。 在这种情况下,它们是时间戳,当时间戳通过我希望它返回到起始线程的当前时间。请参阅下面的代码。

@Override
public void run() {
  while (!data.isEmpty()) {
    for (LocalTime dataTime : data) {
      if (new LocalTime().isAfter(dataTime)) {
        // return a result but continue running
      }
    }
  }
}

我已经阅读了关于未来和可赎回的内容,但他们似乎在回归时停止了这个问题。

我不特别想要返回一个值并停止线程,然后在使用callable时启动另一个任务,除非这是最好的方法。

寻找这个的最佳技巧是什么?似乎有这么广泛的做法。

由于

2 个答案:

答案 0 :(得分:5)

您可以将中间结果放在 Mongoose Nested Array Query 中,以便在消费者线程可用时将结果提供给消费者线程:

takeResult

消费者线程可以简单地调用Result方法来使用中间结果。使用阻塞队列的优点是您不必重新发明轮子,因为这看起来像是一个典型的生产者 - 消费者场景,可以使用阻塞数据结构来解决。

注意此处,{{1}}可以是代表中间结果对象的` POJO

答案 1 :(得分:1)

你走在正确的道路上。假设正确的同步将在那里,您将按时获得所有时间戳:)理想情况下,您应该选择一个不要求您扫描所有项目的数据结构。选择像最小堆或某些升序/降序列表这样的东西,现在迭代时只需从该数据存储中删除元素并将其放在阻塞队列上。有一个正在侦听此队列的线程继续进行。