许多 Executor 实现都对调度任务的方式和时间强加了某种限制。以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new LinkedBlockingQueue<Runnable>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(final Runnable r) {
tasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (active == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
}
没看明白, 这个在外面该如何使用呢? 构造参数Executor是干什么的, 怎么连续的提交任务?
黄舟2017-04-17 16:48:21
關於 Executor 可以參考 java並發程式設計-Executor框架。 SerialExecutor
的作用是使用指定的(透過建構函數傳入)Executor
對象,順序的執行任務(透過execute()
方法實現) SerialExecutor
的作用是使用指定的(通过构建函数传入)Executor
对象,顺序的执行任务(通过 execute()
方法实现)
SerialExectuor.execute()
会把传入的 Runnable
放在队列里,然后按顺序执行,如果队列为空(初始或已经执行完),会立即启动传入的 Runnable
SerialExectuor.execute()
會把傳入的Runnable
放在佇列裡,然後依序執行,如果佇列為空(初始或已經執行完),會立即啟動傳入的Runnable
對象,用法大概就像這樣🎜
SerialExecutor sExecutor = new SerialExecutor(sourceExecutor);
sExecutor.execute(task1);
sExecutor.execute(task2);
sExecutor.execute(task3);
// ...
伊谢尔伦2017-04-17 16:48:21
SerialExecutor與其他Executor的區別在於,使用execute(final Runnable r)提交任務時,如果當前任務執行完成之後,會繼續執行下一個任務,也就是代碼種finally裡面的scheduleNext();這句起的作用,所以就是連續執行了。
普通的Executor框架是透過調度器本身的線程的run方法中無線循環讀取隊列中的任務去觸發任務的執行,而SerialExecutor在每個任務中顯示的調用了scheduleNext來觸發下一個任務的執行。