java.util.concurrent.Executor 介面 原始碼
執行緒池相關
原始碼:
public interface Executor {
void execute(Runnable command);
}
介面 Executor
已知子介面:
ExecutorService, ScheduledExecutorService
已知實現類:
AbstractExecutorService,ThreadPoolExecutorScheduled,ThreadPoolExecutor
執行已提交的 Runnable
任務的物件。
此介面將任務提交與每個任務如何執行的機制分離開來。通常使用 Executor 而不是顯式地建立執行緒。例如,可能會使用以下方法,而不是為一組任務中的每個任務呼叫 new Thread(new(RunnableTask())).start():
Executor executor = new executor介面的實現; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...
Executor 介面並不嚴格要求執行是非同步的。在最簡單的情況下,執行程式可以在呼叫者的執行緒中立即執行已提交的任務:
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }
更常見的是,任務是在某個不是呼叫者執行緒的執行緒中執行的。以下執行程式將為每個任務生成一個新執行緒。
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}
許多 Executor 實現都對排程任務的方式和時間強加了某種限制。
以下執行程式:將使任務提交與第二個執行程式保持連續:
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<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) {//如果正在執行的執行緒為null,即說明佇列之前為空的狀態.此時當前執行緒節點應當立即執行
scheduleNext();//執行當前的頭節點執行緒
}
}
//使得當前頭節點執行
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {//poll():得到當前頭節點並移除;若返回的節點不為null
executor.execute(active);//執行當前節點
}
}
}
此包中提供的 Executor 實現了 ExecutorService
,這是一個使用更廣泛的介面。
ThreadPoolExecutor
類實現了ExecutorService,
提供了一個可擴充套件的執行緒池實現。
Executors
類為這些 Executor 提供了便捷的工廠方法。
方法摘要
void |
execute(Runnable command) 在未來某個時間執行給定的命令。 |
execute
void execute(Runnable command)
在未來某個時間執行給定的命令。該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor 實現決定。
引數:
command
- 可執行的任務
丟擲:
RejectedExecutionException
- 如果不能接受執行此任務。
NullPointerException
- 如果命令為 null