2010-04-09 2 views
0

그것은 CompletionService.take(). isDone() 항상 true입니까?

java.util.concurrent.CompletionService.take().isDone() 

이 항상 true

반환 것이라고 가정하는 안전한가요? 그렇다면 왜 take()는 값이 아닌 미래를 반환합니까? 그렇지 않다면 문서에서 사용 된 "완료된 작업"은 무엇을 의미합니까?

답변

3

다른 것들을 위해 미래를 사용할 수 있기 때문에. 제출하면 미래가 주어집니다(). 따라서 먼저 반환 된 Future 객체를 사용하여 상태를 모니터링하거나 조기에 취소 할 수 있습니다. 둘째, futureFactory()를 변경하면 (다른 것으로 생각되지만 Java 5가 설치되지 않은 것 같음) 향후 모든 객체를 미래 객체에 추가 할 수 있습니다.

take()를 수행 할 때,이 경우 미래 ​​(추적/상태 취소) 부분은 그다지 유용하지 않습니다. 그러나 OTOH, 확장 된 기능을 포함하여 전체 미래를 그대로 되돌려 놓는 것이 어떻습니까?

+2

또한 디자인 대칭에 대한 간단한 답이 있습니다. 완료 서비스를 통해 수행하는 경우 사실이지만 미래는 작업의 원시 표현처럼 유용하지 않으며 Executor 유형 서비스 제출의 다른 모든 측면에 사용되며 그 중 일부는 중요합니다. 에 대한 사용. – MJB

+0

완벽한, 감사합니다. – jfager

0

javadoc은 반환 된 작업이 완료 될 때까지 take() 블록을 암시하는 것으로 보입니다.

+1

나는 그것이 무엇을 의미하는지는 동의하지만, 그 이유는 미래가 값 대신 직접 반환되는 이유에 대한 의문을 남깁니다. 질문을하기 전에이 질문을 오리 테스트 해 보았습니다. 제출 한 순간에 성공이 Future.isDone()이 true를 반환하게하는 유일한 조건은 아니라는 사실이 나에게 발생했기 때문입니다. 미래가 취소 될 때도 그렇게 할 것입니다. 또한 take()에서 반환 된 Future를 이전에 submit()에서 반환 된 해당 Future에 일치시킬 수 있다는 점도 중요합니다. – jfager

관련 문제