非阻塞方法返回可调用的结果

时间:2017-04-23 04:27:17

标签: java executorservice

在calllable的调用线程(main)上等待future.isDone()== true的标准方法是什么?

我尝试通过asyncMethod()在调用线程(主线程)上返回结果。 asyncMethod()立即返回,但在返回之前,首先触发一个导致广播意图返回主线程的进程。在主线程中,我检查future.isDone(),但遗憾的是future.isDone()只返回true的一半时间。

       ExecutorService pool = Executors.newSingleThreadExecutor();
        Callable<Boolean> callable = new Callable<Boolean>(){
            public Boolean call() {
                Boolean result = doSomething();
                callbackAsync();  //calls an async method that returns immediately, but will trigger a broadcast intent back to main thread
                return result;
            }
        };

       new broadCastReceiver() { ///back on main thread
       ...
           case ACTION_CALLABLE_COMPLETE:
               if (future.isDone())   // not always true...
                       future.get();

}

1 个答案:

答案 0 :(得分:0)

您可以在准备好后立即使用CompletionService来接收期货。以下是您的代码

的示例
ExecutorService pool = Executors.newSingleThreadExecutor();
CompletionService<Boolean> completionService = new ExecutorCompletionService<>(pool);

Callable<Boolean> callable = new Callable<Boolean>(){
    public Boolean call() {
        Boolean result = true;
        //callbackAsync();  //calls an async method that returns immediately, but will trigger a broadcast intent back to main thread
        return result;
    }
};

completionService.submit(callable);

new broadCastReceiver() { ///back on main thread
    .....
    Future<Boolean> future = completionService.take(); //Will wait for future to complete and return the first completed future   
    case ACTION_CALLABLE_COMPLETE: future.get();