2017-11-22 17 views
1

answer에서 나는 CallableRunnable 사이의 유일한 차이점은 이전이 실행 결과를 반환하고 예외를 throw 할 수 있다는 것입니다.Executor 인터페이스에 Callable을 매개 변수로 사용하는 메서드가없는 이유는 무엇입니까?

ExecutorCallable 취하는 방법을 정의하지 않는 이유를 이해하지 않습니다 내 관점에서

void execute(Callable command); 

를, RunnableCallable 두 방법을 만들 논리적 일 것입니다. Executor의 하위 인터페이스 인 ExecutorService에는 RunnableCallable에 대해 비슷한 submit() 방법이 있습니다.

인터넷에서 설명을 찾을 수 없기 때문에이 디자인 결정을 설명하십시오.

+0

정말로 알고 싶다면 오픈 포럼에서이를 묻지 말고 실제로 설계 한 사람들에게 물어보십시오. – Stultuske

답변

2

ExecutorCallable을 취하는 방법을 정의하지 않는지 이해할 수 없습니다. 제출 된 작업을 실행 -

Executor는 하나의 책임이있다. 이 추상화 수준에서 Runnable만을 사용하는 API는 ExecutorService에서 제안한 추가 기능을 요구하지 않습니다.

RunnableCallable에 대한 메서드를 만드는 것이 논리적 일 것입니다.

예 따라서 ExecutorService 인터페이스는 Executor을 확장하여 설계되었습니다. ExecutorService은 작업 실행 결과를 제공하는 중요한 차이점을 제공합니다 (). 그 이유는 Callable, TimeUnit 및 라이프 사이클 메소드가 추가 된 이유입니다.

2

나는 Executor 디자인이 가능한 한 단순한 것, 즉 한 가지 방법으로 이루어 졌다고 가정합니다. execute()는 결과를 얻기위한 어떤 수단도 제공하지 않기 때문에 Callable을 받아들이지 않고 Runnables 만 받는다는 것은 의미가 있습니다.

한편, 다양한 submit() 함수는 Futures를 반환합니다. Futures는 결과 (예 : Callable)를 얻거나 단순히 실행이 끝날 때까지 기다리는 데 사용할 수 있습니다. 따라서 Runnable과 Callable을 모두 받아들이는 것이 좋습니다.

2

실행자는 작업을 실행합니다. 작업 실행 방법 및시기를 관리하려는 경우 필요합니다. 집행자는 업무 결과를 수집하지 않으므로 Runnable 만 지원합니다.

Callable을 지원한다고 가정합니다. 그렇다면 어떻게 결과를 가져와야합니까? T execute(Callable<T> command)은 현재 스레드 실행을 차단하므로 옵션이 아닙니다. 따라서 일부 T getResult()과 페어링하거나 Future<T>을 반환해야합니다. 그리고 그 방법은 <T> Future<T> submit(Callable<T> task)ExecutorService입니다.