2014-01-19 2 views
0

제목이 설명이므로 최대 시간 동안 스레드를 기다리고 싶습니다. 이제 1 초가됩니다. 다른 스레드가 응답을 수신하면 괜찮습니다. 그렇지 않으면 1 초 후에 응답이 수신되는지 여부를 기다리지 않고 작업을 계속해야합니다. 나중에 응답이 도착했는지 확인하기 위해 2 초 기다릴 수 있습니다.자바 - 최대 시간 또는 이벤트 (비동기 콜백)를 기다리는 중입니다.

메인 등급 :

atiReq.Now(); //asynchronous method returns immediatly 
       firstATIState = atiReq.getState(1000); // Wait for a max of 1000 ms to get the response 
      } 
      handleIDP(); 
      if (isMobSub && firstATIState == null) { 
       //If ati response was not recived previously wait for another maximum 2000 ms now 
       firstATIState = atiReq.getState(2000); 
      } 

AtiRequest 등급 :

,243,232 10

문제점 : getState와의 대응 코드를 볼 수

firstATIState = atiReq.getState(1000); 

이 라인은, 메인 클래스에서, 1 초 후에 종료 나던

while (!atiResponseRecieved) { 
        try { 
         atiReq.wait(timeout); 
        } catch (InterruptedException ex) { 
         logger.error("Error waiting on atiReq while trying to get aitState", ex); 
        } 
       } 

는이다 (긴 제한 시간)에있어서 그래서 atiReq.wait (timeout)이 1 초 내에 반환되고 atiResponseRecieved가 true가 아닌 경우에도 Now() 메서드의 시간 제한이 다할 때까지 루핑을 계속 유지하고 atiResponseRecieved를 true로 설정합니다.

질문 :이 문제를 해결하려면 어떻게

  1. ? 루프에서 제거하려고 시도했지만 "가짜 깨어"완전히 1 초 기다리지 마라.

  2. 다른 해결 방법이 있습니까?

+0

Java Thread.sleep() 또는 Object.wait()는 스케줄러의 컨텍스트 전환에 의존하기 때문에 스레드를 다시 시작하거나 깨우기위한 정확한 타이밍을 보장하지 않습니다. –

+0

정기적으로 보시면 무엇을 보시고, 허위 모닝콜이 아닙니다. 플랫폼에 따라 절대 또는 전혀 특별한 상황이 발생하지 않습니다. –

답변

2

Futuretask (또는 단지 미래)을 사용할 수 있습니다. 이것 때문에. 시간 초과를 지정할 수있는 get() 메소드가 있습니다.

관련 문제