Java:如何从线程返回中间结果

Java:如何从线程返回中间结果,java,multithreading,java-7,monitor,callable,Java,Multithreading,Java 7,Monitor,Callable,使用Java 7 我正在尝试构建一个监视程序,它监视一个数据存储(某些集合类型),然后在某些点从中返回某些项。 在本例中,它们是时间戳,当时间戳超过当前时间时,我希望它返回到起始线程。请参阅下面的代码 @Override public void run() { while (!data.isEmpty()) { for (LocalTime dataTime : data) { if (new LocalTime().isAfter(dataTime)) {

使用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的文章,但它们似乎在返回时停止了线程

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

寻找这个的最佳技术是什么?做这件事的范围似乎很广


谢谢

您可以将中间结果放入,以便消费者线程在其可用时可以使用这些结果:

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(); 
}
private final LinkedBlockingQueue results=new LinkedBlockingQueue();
@凌驾
公开募捐{
而(!data.isEmpty()){
for(LocalTime dataTime:data){
if(new LocalTime().isAfter(dataTime)){
结果。放(结果);
}
}
}
}
公开结果takeResult(){
返回结果。take();
}
使用者线程只需调用
takeResult
方法即可使用中间结果。使用阻塞队列的优点是,您不必重新发明轮子,因为这看起来像一个典型的生产者-消费者场景,可以使用阻塞数据结构来解决


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

您的路径是正确的。假设存在适当的同步,并且您将按时获得所有的时间戳:)理想情况下,您应该选择一种不需要扫描所有项目的数据结构。选择像min heap或一些升序/降序列表之类的内容,现在迭代时只需从该数据存储中删除元素并将其放入阻塞队列。让正在侦听此队列的线程继续。

将中间结果放入
阻塞队列中,而不是返回结果,并让其他线程从队列中获取这些结果。此run()方法中的循环将消耗大量资源。您应该使用object.wait等待下一个数据时间,而不是仅仅使用upcycles@Stef
!data.isEmpty()
条件将在没有可用数据时退出循环。在我看来,要使用的数据已经一次性填充,而不是一个一个地填充。是的,如果所有数据都已处理完毕,您将干净地退出。但是,如果数据中有一个元素应该在10分钟后返回呢?@Stef您可以提出很多方案。问题是在这个问题的背景下,它们是否有效。我相信您的场景在这种情况下是无效的,因为即使在一纳秒之内没有数据,代码也会退出。使用object.wait也不是一个理想的解决方案。新帖子:@Stef