2017-03-09 19 views
0

나는 약간의 javadoc를 읽고 있던 나는 누군가가 코드가있는 경우 첫 번째 전달할 수있는 방법을 나에게 설명 할 수 this example from ThreadPoolExecutor.afterExecute(...) javadocs:Runnable instanceof Future <?>?

class ExtendedExecutor extends ThreadPoolExecutor { 
    // ... 
    protected void afterExecute(Runnable r, Throwable t) { 
    super.afterExecute(r, t); 
    if (t == null && r instanceof Future<?>) { 
     try { 
     Object result = ((Future<?>) r).get(); 
     } catch (CancellationException ce) { 
      t = ce; 
     } catch (ExecutionException ee) { 
      t = ee.getCause(); 
     } catch (InterruptedException ie) { 
      Thread.currentThread().interrupt(); // ignore/reset 
     } 
    } 
    if (t != null) 
     System.out.println(t); 
    } 
} 

을 가로 질러왔다. 내 말은 r이 instanceof가 될 수 있다는 뜻입니까 Future<?>?

+4

당신은 그것이 왜 가능하지 않다고 생각하는지 설명 할 수 있습니까? – ruakh

+2

음, 아마도'r'은 [RunnableFuture] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RunnableFuture.html)입니다. – azurefrog

+6

'Foo는 Runnable, Future를 구현합니다 {...}' –

답변

2

코드가 첫 번째를 전달할 수있는 방법을 설명 할 수있는 사람이 누구나 있습니다. 나는 미래가 어떻게 될 수 있단 말인가?

혼동을주지 마십시오. Runnable에 전달 된 이상한 코드이며 으로 캐스팅하려고 시도하지만 Runnable은 확장되지 않습니다. 자주 보는 패턴이 아닙니다. 이 코드는 ThreadPoolExecutor.afterExecute(...) javadocs에 대한 javadocs에 있으며 코드를보고 나면 메서드에 대한 r 인수가 완료된 작업입니다.

Future 대신 FutureTask 인 경우 코드가 훨씬 더 깨끗하다고 ​​생각합니다.

조치 (예를 들면 {@link FutureTask} 같이) 작업 묶

...

FutureTaskRunnableFuture 구현 모두가 : FutureTask에도 바로 JavaDoc에서의 샘플 코드를 상기 설명한 RunnableFuture이므로 코드가 작동하지만 FutureTask을 사용하면 덜 혼란 스럽습니다.

+0

'FutureTask'는'Runnable'과'Future' 둘 다에 속하는 구현 중 하나입니다. 'Runnable'과'Future'의 일부이지만 여전히'FutureTask' 오브젝트 밖의 다른 오브젝트들의 집합이있을 수 있습니다. 나는 javadoc이 더 정확하다고 생각한다. 'FutureTask'를 사용한다면 써드 파티 프레임 워크 나 심지어 여러분이 도입 할 수도있는 구현을 놓칠 수도 있습니다. – ony