Java : How to return intermediate results from a Thread

标签 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
      }
    }
  }
}

我读过有关 future 和 callables 的内容,但它们似乎会在返回时停止线程。

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

查找此内容的最佳技术是什么?似乎有如此广泛的范围。

谢谢

最佳答案

您可以将中间结果放在 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 方法来使用中间结果。使用阻塞队列的优点是您不必重新发明轮子,因为这看起来像典型的生产者-消费者场景,可以使用阻塞数据结构来解决。

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

关于Java : How to return intermediate results from a Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605624/

相关文章:

java - Spring @Transactional 传播属性

c++ - c++多线程应用程序上的内存损坏

ios - @synchronized() 接受的参数是什么

Java-重用具有相同运行但不同参数的线程

java - EhCache的BootstrapCacheLoader是否关注缓存设置?

java - 以编程方式垂直对齐 TextView 文本(无 XML)

java - JSR305 与 JSR308(Java 类型注释)——哪个将成为标准?

java - 使用 Java 6 编译

java - 在 Eclipse JPA 项目中获取 UnsupportedClassVersionError 这是没有意义的

java - 如何通过内部方法更改对象的值?