2012-02-17 4 views
12

시간 초과가 0 인 'Future.get'이 기다리지 않는다는 것을 명확히하는 문서를 누군가가 가르쳐 줄 수 있습니까?timeout이 0 인 future.get의 동작

java.util.concurrent.Future에 대한 API 문서는 future.get(0, unit)의 동작을 명시 적으로 나타내지 않습니다. 자체적으로 서서, "필요한 경우 최대 대기 시간 ..."이라는 문구는이 호출이 전혀 대기하지 않는다는 것을 의미하지만, 오랫동안 지속되는 동작 인 Object.wait(0) (무한 대기)을 감안할 때, 나는 (즉. FutureTask)가 나는 시간 제한 내가 '0

Future이 특정 구현을 기다리지 않고 볼 일부 JDK에서 제공하는 클래스의 소스를 스캔 future.get(0, unit)

의 "아니오 대기"행동에 d는 말할 수있는 것을 좋아한다

long timeout = Math.max(until - now, 0); 
    return future.get(timeout, TimeUnit.MILLISECONDS); 

나는 미래에 관해 신경 작용에 의하다 무한 대기로, 그래서 대신 내가 명시 적으로 그것을 내가이 일을 기대할 수있는 방법을 코딩 한 것을 구현 : 그 도움이된다면 나는 몇 가지 코드에서 당신을 가리킬 수 있습니다

long timeout = Math.max(until - now, 0); 
    if(timeout > 0 || future.isDone()){ 
     return future.get(timeout, TimeUnit.MILLISECONDS); 
    } else { 
     throw TimeoutException(); 
    } 
+0

@skaffman 태그 수정에 감사드립니다. – mwhidden

답변

7

주어진 시간 동안 & hellip;

대기 시간이 많아서 0 시간 단위가 대기하지 않습니다. 이것은 암묵적인 암시는 아니며 명시 적 보증입니다.

+3

승인 됨. 필자는 Object.wait (long)과의 의미의 차이가 문서에서 명시된 구별을해야한다고 생각했습니다. 'Object.wait'조차도 처음에는 대기 시간을 보장하지 않는 것처럼 보이지만 시간 제한은 0으로 설정하면 실시간은 고려되지 않습니다. 스레드는 알림을받을 때까지 대기합니다. " – mwhidden

5

. java.util.concurrent.FutureTask에보고 한 후 AbstractQueuedSynchronizer에 나는 내가 relavent 비트를 보여주기 위해 아래로 껍질을 벗겼다 한 다음 루프를 페이지의 :

private boolean doAcquireSharedNanos(int arg, long nanosTimeout) { 
    long lastTime = System.nanoTime(); 
    for (;;) { 
     ... 
     if (nanosTimeout <= 0) { 
      cancelAcquire(node); 
      return false; 
     } 
     long now = System.nanoTime(); 
     nanosTimeout -= now - lastTime; 
    } 

이 의미 nanosTimeout는 0에 전달하는 경우가 될 것이다 (0 인 경우 get) 그러면 미래를 한 번 획득 한 다음 타임 아웃하고 false를 반환하려고합니다.

기분이 나아진다면 시간 제한을 1 나노초로 설정할 수 있습니다.

+0

고마워요! 이것이 내가 연구 한 동안 정확히 검토 한 코드입니다. – mwhidden

관련 문제