同時基礎(一):Executor
2222 ワード
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*/
void execute(Runnable command);
}
Executorは、Runnableタスクを実行し、タスクのコミットプロセスを特定の実行メカニズムとデカップリングするためのインタフェースです.Executorがあれば、スレッド、スケジューリングなど、タスクの実行をどのように制御するかを気にする必要はありません.もちろん、これらはExecutorインタフェースの実装方法に依存します.単一スレッド、マルチスレッド、スレッドプールなどを使用して特定のタスクを実行したり、追加のスレッドを有効にせずに呼び出し元のスレッドでタスクを完了したりすることができます.例:
1.呼び出しスレッドでタスクを完了します.
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}}
2、マルチスレッド、タスクごとに1つのスレッド:
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}}
3, Many
Executor
implementations impose some sort of limitation on how and when tasks are scheduled. The executor below serializes the submission of tasks to a second executor, illustrating a composite executor. 多くのExecutorの実装では、タスクの実行タイミングとスケジューリング方法をカスタマイズします.次のSerialExecutorは、serial executorにコミットされたすべてのタスクをシリアルで実行するようにタスクのスケジュールをカスタマイズし、タスクの具体的な実行プロセスは別のexecutorに任せ、executorを変更して構築方法で入力します.
class SerialExecutor implements Executor {
final Queue tasks = new ArrayDeque();
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インタフェースのサブクラスが実装されました.
AbstractExecutorService,
ExecutorService,
ForkJoinPool,
ScheduledExecutorService,
ScheduledThreadPoolExecutor,
ThreadPoolExecutor