I created a java thread pool using
dbChangeService = Executors.newSingleThreadExecutor();
I have implemented a runnable interface and added it to
Future future = dbChangeService.submit(dbChgProcessor);
when I do future.isDone()
it returns false
which is understandable because I am checking immediately after submitting.
What is the correct way of using Future.isDone()
method so that it can produce meaningful results.
PS: I don't want to use Future.get()
which is a blocking call.
CodePudding user response:
Instead of simply doing future.isDone()
, you should poll for it to be true. E.g.
while(!future.isDone())
{
log.info("future not done yet, waiting before retrying...");
Thread.sleep(300);
}
Object result = future.get();
This still is still kind of blocking, so you probably wanna do it on another thread that will notify your main tread using a lock object. Or even better why not use CompletableFuture
? See resources here & here.
CodePudding user response:
So first of all let me clarify that:
Future.isDone()
tells us if the executor has finished processing the task.
If the task is complete, it will return true
otherwise, it returns false
.
I would suggest you to use CompletableFuture
, something like:
CompletableFuture.supplyAsync(() -> {
...
});
This will return a CompletableFuture
as well.
As I said in the comments, a CompletableFuture
provides a broad set of methods for creating multiple Futures, chaining, and combining. It also has comprehensive exception handling support
Check a full guide with CompletableFuture
examples here