Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java : How to return intermediate results from a Thread

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

like image 855
perkss Avatar asked Jul 24 '15 08:07

perkss


2 Answers

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.

like image 189
Chetan Kinger Avatar answered Oct 13 '22 17:10

Chetan Kinger


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.

like image 33
Geek Avatar answered Oct 13 '22 17:10

Geek