private static class SerialExecutor implements Executor {
final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
Runnable mActive;
public synchronized void execute(final Runnable r) {
mTasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (mActive == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((mActive = mTasks.poll()) != null) {
THREAD_POOL_EXECUTOR.execute(mActive);
}
}
}
上面的代码 fragment 来自实现 SerialExcutor 的 AsyncTask 源代码,但我不明白它是如何工作的。
当一个新任务到达时,它被放入一个ArrayDeque的末尾,只有当当前没有其他任务正在执行时,ArrayDeque顶部的任务才会被执行。 (当 mActive == null 时)。
那么如果一个任务正在执行,当一个新任务到来时,什么都不会被触发,当任务执行完,ArrayDeque怎么知道弹出最上面的下一个任务来执行它???
最佳答案
任务由接受 Runnable
的 THREAD_POOL_EXECUTOR
在单独的线程上执行。在这个 Runnable
中,当运行的任务由于某种原因完成时, scheduleNext()
在 finally
block 中被调用。如果队列中有任何任务,第一个将被执行,否则执行器将空闲直到下一次调用 execute()
。此外,synchronized
确保 execute()
和 scheduleNext()
不能同时在不同的线程中运行。
关于android - AsyncTask SerialExecutor 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207811/