Executor

接口 java.util.concurrent.Executor

所有已知子接口:ExecutorService, ScheduledExecutorService

所有已知实现类:AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor

它用于执行Runnable任务。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法.通常使用Executor而不是显式地创建线程.

例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():

Executor executor = anExecutor;
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的实现都对调度任务的方式和时间强加了某种限制。以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。
示例1

 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); } } }}

 注意1:

许多Executor的实现都对调度任务的方式和时间强加了某种限制。所以如果我们想要任务一个一个的顺序被执行,可以才采用示例1(SerialExecutor)的方式。

此包中提供的Executor实现都实现了ExecutorService,ExecutorService是Executor的一个子类,它提供了一个使用更广泛的接口。

比如ThreadPoolExecutor类就同时实现了Executor和ExecutorService接口,它提供一个可扩展的线程池实现。Executors类为创建这些Executor提供了便捷的工厂方法。

注意:Executor的直接子接口ExecutorService, ExecutorService的直接子接口(Executor的间接子接口)ScheduledExecutorService提供了更为广泛使用的接口。

            关于ExecutorService的更多知识请参阅《ExecutorService》, 

            关于ScheduledExecutorService的更多知识请参考《ScheduledExecutorService》。

内存一致性效果:线程中将 Runnable 对象提交到Executor 之前的操作 happen-before 其执行开始(可能在另一个线程中). 

主要方法:

void execute(Runnable command)
    在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。
    参数:command - 可运行的任务
    抛出:
        RejectedExecutionException - 如果不能接受执行此任务。 
        NullPointerException - 如果命令为 null
注意:该方法是它自己唯一的方法。

posted @ 2014-10-07 02:36  princessd8251  阅读(205)  评论(0)    收藏  举报