1.Executor执行提交的线程任务,解耦任务的提交和执行,通常用于替代明确地创建线程
Executor executor = anExecutor;
executor.execute(new RunnableTask());
new Thread(new RunnableTask()).start();
2.Executor不要求必须异步执行任务,可以立即执行提交的任务
new Executor() {
@Override
public void execute(Runnable command) {
command.run();
}
};
3.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) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
};
4.Executor接口相关类的介绍
Executor.png- ExecutorService 继承Executor,相比于Executor,提供了生命周期的管理以及使用Future跟踪异步任务的运行。
2.AbstractExecutorService 抽象类,实现了ExecutorService的submit方法。
3.ScheduledExecutorService 可调度的执行器,能根据给定的延迟执行任务或周期性的执行任务。
4.ThreadPoolExecutor 线程池,提供了一系列的静态工厂方法创建不同的线程池并返回一个ExecutorService对象。
5.ScheduledThreadPoolExecutor 可调度的线程池执行器。多个任务调度时比java.util.Timer更好
PS:Timer单线程执行任务,多个任务执行时,可能会干扰导致任务延迟,导致没有按照预期执行;Timer不捕获异常,如果某个任务执行时抛出了UncheckedException,会导致所有任务取消退出执行;Timer是基于系统时间,如果中途修改系统时间,任务会按照系统时间来严格执行;
网友评论