2016-08-03 3 views
2

Я относительно новичок в ThreadPoolExecutor. Я вижу, могу ли я отслеживать выполнение, пока не будет выполненным и в afterExecute.ScheduledThreadPoolExecutor afterExecute runnable.toString отличается

Получив runnable.toString() используя afterExecute(Runnable t, Throwable t). Теперь я понимаю, что могу просто поставить журнал внутри самого runnable ... но мне было любопытно, что этот метод будет производить.

Для ThreadPoolExecutor, работает нормально, runnable.toString - то же самое до execute(runnable), а также в afterExecute().

Однако! ScheduledThreadPoolExecutor - другой. Его runnable.toString afterExecute совсем другой.

К примеру, до: [email protected], afterExecute: java.[email protected]zxc

Не даже название упак то же самое. Почему это?

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

Спасибо. Я вижу, поэтому он трансформируется в другой класс, а затем выполняется оттуда, что объясняет, почему toString полностью изменилась. – TWL

Смежные вопросы