疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java中Executor接口


 

 一、结构

  位于java.util.concurrent包下。 声明为:public interfaceExecutor

  所有已知子接口: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 实现都对调度任务的方式和时间强加了某种限制。以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。

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

  }

  }

  }

  此包中提供的 Executor 实现实现了 ExecutorService,这是一个使用更广泛的接口。ThreadPoolExecutor 类提供一个可扩展的线程池实现。Executors 类为这些 Executor 提供了便捷的工厂方法。

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

  三、方法详细:

  void execute(Runnable command)

  在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。

  参数:command - 可运行的任务

  抛出:RejectedExecutionException - 如果不能接受执行此任务。

  NullPointerException - 如果命令为 null