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

per*_*kss 6 java multithreading monitor callable java-7

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

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

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

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

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

谢谢

CKi*_*ing 5

您可以将中间结果放在阻塞队列中,以便在消费者线程可用时将结果提供给消费者线程:

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(); 
}
Run Code Online (Sandbox Code Playgroud)

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

注意这里Result可以是表示中间结果对象的` POJO.