2016-08-03 6 views
2

저는 비교적 새로운 ThreadPoolExecutor입니다. 실행 시간을 으로 실행하기 전에을 실행하고 실행 후을 실행하면 이 실행되는 것을 볼 수 있습니다.ScheduledThreadPoolExecutor afterExecute의 runnable.toString이 다릅니다

runnable.toString()을 사용하면 afterExecute(Runnable t, Throwable t)을 사용합니다. 이제 로그를 실행 파일 자체에 넣을 수 있다는 것을 알았지 만,이 방법이 무엇을 만들지 궁금했습니다.

ThreadPoolExecutor의 경우 runnable.toStringexecute(runnable)afterExecute() 전에 동일하게 작동합니다.

그러나! ScheduledThreadPoolExecutor이 다릅니다. 그것의 Execute의 runnable.toString은 전혀 다른입니다. 전에 예를 들어

: [email protected], afterExecute는 : java.[email protected]zxc

조차 PKG 이름은 동일합니다. 이유가 무엇인가요?

private MyThreadPool() { 
    threadPool = new ThreadPoolExecutor(NUMBER_OF_CORES, MAX_CORES, 
     KEEP_ALIVE_TIME, KEEP_ALIVE_TIME_UNIT, workQueue) { 
     @Override 
     public void afterExecute(Runnable r, Throwable t) { 
      super.afterExecute(r, t); 
      Log.d(TAG, "ThreadOps onDone: " + r.toString()); 
      // (A) will return same --> [email protected] 
     } 
    }; 
    threadPool.setRejectedExecutionHandler(rejectedHandler); 

    scheduledThreadPool = new ScheduledThreadPoolExecutor(NUMBER_OF_CORES) { 
     @Override 
     public void afterExecute(Runnable r, Throwable t) { 
      super.afterExecute(r, t); 
      Log.d(TAG, "ThreadOps onDelayDone: " + r.toString()); 
      // (D) does not return same? 
      // I am expecting --> [email protected] , but get... 
      // java.[email protected]zxc 
     } 
    }; 
    scheduledThreadPool.setRejectedExecutionHandler(rejectedHandler); 
} 

public void execute(Runnable runnable) { 
    Log.d(TAG, "ThreadOps exe: " + runnable.toString()); 
    // (A) lets say toString --> [email protected] 
    threadPool.execute(runnable); 
} 

public void delayExecute(Runnable runnable, long delayms) { 
    Log.d(TAG, "ThreadOps exe @" + delayms + ": " + runnable.toString()); 
    // (D) lets say toString --> [email protected] 
    scheduledThreadPool.schedule(runnable, delayms, TimeUnit.MILLISECONDS); 
} 

답변

1

ScheduledThreadPoolExecutor 내부적으로 쉽게 추가하고 예정 (힙의 맨 위에 다음 실행해야 즉. 한)에 따라 제출 된 작업을 검색 할 종류의 힙을 유지합니다. 이 힙을 액세스 할 수 있도록하려면

ScheduledThreadPoolExecutor의 구현은 Runnable 또는 Callable 경우 당신에게 무엇보다도 힙의 위치를 ​​설명하는 사용자 정의 구현 schedule을 장식. 로그에 표시되는 내용은 ScheduledFutureTask입니다. 이것은 구현 세부 사항입니다 (이 클래스는 private입니다). 따라서이 클래스에 의존해서는 안됩니다.

+0

고맙습니다. 그래서 다른 클래스에서 변형 된 다음 거기에서 execute'd가 발생하여 toString이 완전히 변경된 이유가 설명됩니다. – TWL