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
解决方案
You can put the intermediate results in a
private final LinkedBlockingQueue results = new LinkedBlockingQueue();
@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.