Executor 是一个任务执行器抽象,它提供了一种解耦机制:将任务的提交和任务的调度、执行分离,执行器的使用者只需要将任务通过编程接口提交到执行器中,并不需要关心任务本身是如何被管理的、如何被调度的、如何执行的等问题,大大降低了使用和心智负担;同时,Executor 也为我们屏蔽了直接创建线程,只需要这么使用:
Executor executor = ...;
executor.execute(() -> {
// task
});
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
ScheduledExecutorService 也是一个接口定义,在 ExecutorService 的基础之上提供了在给定延时的时间上执行任务的能力和周期性执行任务的能力;比如 schedule
和 scheduleAtFixedRate
等可以创建各种形式的延时执行任务,并返回任务对象来跟踪任务的执行状态
public interface ScheduledExecutorService extends ExecutorService {
// 创建并执行一次性任务,delay 可以指定延时执行的时间
public ScheduledFuture<?> schedule(Runnable command,
long delay, TimeUnit unit);
public <V> ScheduledFuture<V> schedule(Callable<V> callable,
long delay, TimeUnit unit);
// 周期性执行任务调度
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
// 以固定的时延执行任务
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
}