2010-06-03 4 views
4

논의의 이유로, 내가 취소 할 수없는 작업에 Future을 구현한다고 가정 해 봅시다. Java 6 API doc는 말한다 : isDone()로 돌아 후속 호출은 항상 true를 반환합니다java.util.concurrent.Future의 불일치?

[cancel()] 후.

[cancel()] 반환 false이 작업은 이미

또한 말한다 정상적으로 완료 일반적으로하기 때문에, 취소 할 수없는 경우 :

[isDone()] 반환 true을이 작업을 완료합니다.

그러나 작업이 이미 완료되어 있기 때문에 단순히 취소 할 수 없기 때문에 내 취소 만이 아니라 실패하면? 이 모순에서 빠져 나갈 수있는 방법이 있습니까 (취소 할 수없는 작업을 취소 할 수 없게 만들고 그것을 모두 물리 치는 것 이외의 방법)?

+2

"completed"의 자격이 누락되었습니다. '정상 종료, 예외 또는 취소로 인한 완료 일 수 있습니다.이 경우 모두이 메소드는 true를 반환합니다. ' –

+1

'Future.cancel (boolean)'을 인용해도됩니다 : * 태스크가 이미 완료되었거나, 이미 취소되었거나, 취소 될 수없는 경우 ** 다른 이유로 인해 ** 시도는 실패합니다 **. 어떤 이유로 든 취소하지 않는 것이 합법적 인 것 같습니다. –

답변

1

JavaDoc에서 종종 플랫 아웃 잘못과 모순 ... isDone()

cancel() 후 반환 사실, 후속 호출 말을해야하는 문서처럼 보인다, 그리고 않습니다 썬은 10 년 후에도 문제를 해결하지 못하는 경우가 종종 있습니다. 신중한 테스트는 항상 문서를 보완해야합니다.

+0

문서의 확장으로 "신중한 테스트"의 출력에 의존하지 않겠습니다. 사양이 특정 적이 아닌 경우 다른 구현 (동일한 VM의 다른 버전 포함)이 다르게 동작 할 수 있습니다. 당신이 안전하고 싶다면 스트릭 스 스펙으로. – Romain

+0

@Romain : 참조 (및 사실상 표준) 구현이 사양을 준수하지 않을 때 스펙을 고수하는 것이 안전하다고 어떻게 말할 수 있는지 모르겠다. 귀하의 프로그램은 99 %의 경우에 잘못 될 것이지만 어쩌면 아무도 사용하지 않을 환경에 적합 할 것입니다. –

+0

나는 99 %의 시간이 넓은 각색이라고 생각한다. 사양은 보통 잘못이 아니지만 때로는 매우 불충분하게 표현되고 부정확합니다. – Romain