2017-04-23 4 views
0

future.isDone() == true를 호출하는 스레드 (main)에서 다시 참을 때까지 기다리는 표준 방법은 무엇입니까?호출 가능한 결과를 반환하는 비 차단 방법

asyncMethod()를 통해 호출 스레드 (주 스레드)에서 결과를 반환하려고했습니다. asyncMethod()는 즉시 반환하지만 반환하기 전에 먼저 주 스레드로 브로드 캐스트 인 텐트를 반환하는 프로세스를 트리거합니다. 주 스레드에서 future.isDone()을 확인하지만 불행히도 future.isDone()은 반의 시간 만 반환합니다.

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

} 

답변

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