2017-05-15 2 views

답변

1

때문에 그냥 실행합니다. Future<Void> submit(Runnable task)new Thread(runnable).start()과 동일하게 작동하며 어떤 경우에는 null의 결과가 의미가 있습니다.

편집 : 20 분 후에 스레드를 닫아야한다고 생각합니다. 반환 값이 void 일 때 어떻게합니까? future에 아무런 수익이 없기 때문에

Future<Void> future = execService.submit(operation); 
execService.shutdown(); 
opResult = future.get(20, TimeUnit.MINUTES); 

이 코드는 오류를 부여해야합니다. 그러나 null을 반환하면 execService 컨트롤러 객체는 shutdown이 발생했다는 것을 알게됩니다. 그렇지 않으면 20 분 안에 아무것도 반환하지 않으면 execService.shutdownNow()을 사용할 수 있습니다.

+1

에 변경. – starikoff

+0

어떻게 호출 메소드에서 Void를 반환 할 수 있습니까? –

+1

'void 메소드() {return null; } ' – starikoff

1

Runnablerun 메서드는 void 프리미티브를 반환하며 Void 타입이 아닙니다. 따라서 Future에는 Void 유형을 사용할 수 없으며 해결책은 와일드 카드로 만드는 것이 었습니다. Future은 Java 1.5에서 제공되는 반면 Runnable은 1.0에서 가져온 것입니다. 레거시 코드 이유로 인해 Future과 일치하도록 run의 반환 유형을 변경하지 않습니다.

+0

'Future '의 get 메소드는 항상이 상황에서 요구되는 것과 같은'null'을 반환합니다. 'Future '는'submit' 메쏘드의 javadoc에 기술 된 것처럼, 실제로이 경우 항상'null'을 반환 할 때 어떤 객체도 반환 할 수 있습니다. 따라서'Future '이 올바른 선택이었을 것입니다.비슷하게,'run'이'double'을 반환한다면'Future '보다는'Future '가 적당 할 것입니다. – Roland

1

Jdk 1.8 제출 방법 내부 구현 jdk1.6에서 void가 사용되었습니다. Object였습니다. jdk1.7/1.8에서 변경된 이유는 void를 사용하는 것이 더 적절하다는 것입니다. 인터페이스 만 지원하는 것은 아닙니다.

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Void> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 

하고 있었다면 지금처럼`미래 가`, 정확히 같은 방식으로 작동 할 JDK 1.6

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Object> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 
+0

예, 나중에 인터페이스를 변경하고 싶지 않습니다. 그러나 그것이 왜 그것이 처음에있는 방식으로 정의 되었습니까? 'Void' 유형은 [Java 1.1] (https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html) 이후에 제공되었습니다. 그래서 나는 그것이 실수 였을 것이라고 생각합니다. – Roland

관련 문제