Java : How to return intermediate results from a Thread

。_饼干妹妹 提交于 2019-12-23 09:37:21

问题


Using Java 7 I am trying to build a watcher that watches a data store (some collection type) and then will return certain items from it at certain points. In this case they are time stamps, when a timestamp passes the current time I want it to be returned to the starting thread. Please see code below.

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

I have read about future and callables, but they seem to stop the thread on a return.

I do not particularly want to return a value and stop the thread then start another task if using callable, unless it is the best way.

What are the best techniques to look for this? There seem to be such a wide range of doing it.

Thanks


回答1:


You can put the intermediate results in a Blocking Queue so that the results are available to consumer threads as and when they are made available :

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(); 
}

Consumer threads can simply call the takeResult method to use the intermediate results. The advantage of using a Blocking Queue is that you don't have to reinvent the wheel since this looks like a typical producer-consumer scenario that can be solved using a blocking data structure.

Note Here, Result can be a `POJO that represents the intermediate result object.




回答2:


You are on the right path. Assuming proper synchronization will be there and you will be getting all your timestamps on time :) You should ideally choose a data structure that doesn't require you to scan through all the items. Choose something like a min heap or some ascending/descending lists and now when you iterate just delete the element from this data store and put it on a Blocking Queue. have a thread that is listening on this queue to proceed further.



来源:https://stackoverflow.com/questions/31605624/java-how-to-return-intermediate-results-from-a-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!