Java ScheduledThreadPoolExecutor afterExecute';s runnable.toString不同

Java ScheduledThreadPoolExecutor afterExecute';s runnable.toString不同,java,android,multithreading,runnable,java-threads,Java,Android,Multithreading,Runnable,Java Threads,我对ThreadPoolExecutor比较陌生。我正在查看是否可以在执行之前和执行之后跟踪runnable 通过使用afterExecute(runnable t,Throwable t)获取runnable.toString()。现在,我意识到我可以在runnable里面放一个日志。。。但我很好奇这种方法会产生什么结果 对于ThreadPoolExecutor,工作正常,runnable.toString在execute(runnable)之前和afterExecute()中都是相同的 然而

我对
ThreadPoolExecutor
比较陌生。我正在查看是否可以在执行之前和执行之后跟踪runnable

通过使用
afterExecute(runnable t,Throwable t)获取
runnable.toString()
。现在,我意识到我可以在runnable里面放一个日志。。。但我很好奇这种方法会产生什么结果

对于
ThreadPoolExecutor
,工作正常,
runnable.toString
execute(runnable)
之前和
afterExecute()中都是相同的

然而<代码>ScheduledThreadPoolExecutor
不同。它的afterExecute的runnable.toString完全不同

例如,before:
my.pkg。name@abc
,afterExecute:
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@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 --> mypkgname@abc
        }
    };
    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 --> mypkgname@qwe , but get...
            // java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@zxc
        }
    };
    scheduledThreadPool.setRejectedExecutionHandler(rejectedHandler);
}

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

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

ScheduledThreadPoolExecutor
在内部维护一个排序堆,以便根据已调度的任务(即需要在堆顶部执行的任务)轻松添加和检索已提交的任务


为了帮助访问此堆,
ScheduledThreadPoolExecutor
的实现用一个描述其在堆中位置的自定义实现装饰
Runnable
Callable
实例。这就是您在日志中看到的
ScheduledFutureTask
。请注意,这是一个实现细节(它是一个
private
类),您不应该依赖它。

谢谢。我明白了,所以它在另一个类中被转换,然后从那里执行,这解释了为什么toString已经完全改变了。