2008-11-10 5 views

답변

3

편집 :

responsetask가 할당을 담당하는 RemoteResponse 것을 참조입니다. 메서드에서 반환 값을 할당하면 메서드가 예외를 throw하면 발생하지 않으므로 response의 특수 처리가 필요하지 않습니다.

task은 정상 실행 또는 예외가 발생할 경우 범위를 벗어나면 참조되지 않습니다.

task에 의해 할당 된 자원을 잘 캡슐화하는 경우, 즉 어떤 외부 참조가 개최되며, (close, release, 무엇이든), 다음, 자원 누출이 없어야 해제됩니다.

task에는 나머지 응용 프로그램에 필요한 독점적으로 또는 다른 소모품 자원이있는 공유 자원이 없으면 취소를 호출 할 필요가 없습니다.

적어도 작업이 할당 된 시간 내에 완료되지 않았다는 사실을 기록하고 싶습니다. 그 밖의 작업은 응용 프로그램의 요구 사항에 따라 다릅니다.

get 호출에 관계없이 task은 완료 될 때까지 계속 실행됩니다.

1

문제를 보는 방법은 FutureTask 외부에서 리소스를 요청해야하므로 리소스를 취소하기로 결정할 때 리소스를 다시 사용할 수 있도록해야한다고 생각합니다.

그래서 : 당신이 자원이 해제 될 것이라고 확신 할 수

Resource res = null; 
try { 
resource = ResourceAquirer.claim() 

FutureTask<?> task = new FutureTask<?>(resource); 
executor.execute(task); 
response = task.get(1000, TimeUnits.MILLISECONDS); 
} catch (Exception e) { 
    // logging 
} finally { 
if (resource != null) { 
    resource.release(); 
} 
} 

이 방법. 그 모든 것들이 미래의 과제 안에서 감추어 질 수는 없지만, 나는 futureTask에서 cancel을 호출하면 finallyTrack이 FutureTask 내부에서 호출된다는 것을 알 수 없다. (어쩌면 내가 다른 질문으로 물어볼 것입니다)

+0

좋은 접근 방법 인 것 같습니다. – Dave

+0

FutureTask에서 Future # cancel()을 호출하고 그 호출이 실제로 작업을 취소하면 (이전에 취소되지 않았거나 이미 실행이 완료되었다고 가정 할 때) 보호 된 메소드 FutureTask # done()이 호출됩니다. done() 내에서 Future # isCancelled()를 호출하여 취소 작업을 완료했는지 확인할 수 있습니다. 즉, done()은 한 번만 호출됩니다. FutureTask에서 run() 또는 cancel()을 호출하지 않으면 done()이 호출되지 않습니다. – seh

관련 문제