模块 java.base

接口 Executor

所有已知的子接口:
ExecutorService , ScheduledExecutorService
所有已知的实现类:
AbstractExecutorService , ForkJoinPool , ScheduledThreadPoolExecutor , ThreadPoolExecutor

public interface Executor
执行提交的 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<>();
  final Executor executor;
  Runnable active;

  SerialExecutor(Executor executor) {
   this.executor = executor;
  }

  public synchronized void execute(Runnable r) {
   tasks.add(() -> {
    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 类为这些执行器提供了方便的工厂方法。

内存一致性影响:在将 Runnable 对象提交给 Executor 发生在之前 之前线程中的操作可能在另一个线程中开始执行。

自从:
1.5
  • 方法总结

    修饰符和类型
    方法
    描述
    void
    execute(Runnable command)
    在将来的某个时间执行给定的命令。
  • 方法详情

    • execute

      void execute(Runnable  command)
      在将来的某个时间执行给定的命令。该命令可以在新线程、池线程或调用线程中执行,由 Executor 实现自行决定。
      参数:
      command - 可运行任务
      抛出:
      RejectedExecutionException - 如果这个任务不能被接受执行
      NullPointerException - 如果命令为空