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已经完全改变了。