Executor简介-笔记

2018-08-08  本文已影响0人  键盘车神

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
  1. ExecutorService 继承Executor,相比于Executor,提供了生命周期的管理以及使用Future跟踪异步任务的运行。

2.AbstractExecutorService 抽象类,实现了ExecutorService的submit方法。

3.ScheduledExecutorService 可调度的执行器,能根据给定的延迟执行任务或周期性的执行任务。

4.ThreadPoolExecutor 线程池,提供了一系列的静态工厂方法创建不同的线程池并返回一个ExecutorService对象。

5.ScheduledThreadPoolExecutor 可调度的线程池执行器。多个任务调度时比java.util.Timer更好

PS:Timer单线程执行任务,多个任务执行时,可能会干扰导致任务延迟,导致没有按照预期执行;Timer不捕获异常,如果某个任务执行时抛出了UncheckedException,会导致所有任务取消退出执行;Timer是基于系统时间,如果中途修改系统时间,任务会按照系统时间来严格执行;

上一篇下一篇

猜你喜欢

热点阅读