执行者

Executor是实现Runnable任务启动的类的基接口。这有助于添加任务以及如何启动它。

ExecutorService是一个接口,它扩展了Executor 的属性,它描述了用于运行RunnableCallable任务的服务。提交方法接受CallableRunnable形式的任务作为,并使用 Future 作为返回值,通过它可以得到结果。

invokeAll方法负责执行任务,返回任务列表及其状态和完成结果。

invokeAny方法负责执行任务,返回成功完成任务的结果(即不抛出异常),如果有的话。

ScheduledExecutorService - 此接口添加了以特定延迟或特定时间段运行挂起任务的能力。

AbstractExecutorService是一个抽象类,用于构造一个 ExecutorService 'a. 里面有submit invokeAll invokeAny方法的实现。该类继承ThreadPoolExecutor ScheduledThreadPoolExecutorForkJoinPool

public static void main(String[] args) {
   ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
   Callable<String> task = () -> {
       System.out.println(Thread.currentThread().getName());
       return Thread.currentThread().getName();
   };
   scheduledExecutorService.schedule(task, 10, TimeUnit.SECONDS);
   scheduledExecutorService.shutdown();
}

线程池执行器

Executors是一个用于创建ThreadPoolExecutor ScheduledThreadPoolExecutor的工厂类。如果您需要创建其中一个池,那么这个工厂正是您所需要的。它包含不同的适配器 Runnable-Callable、PrivilegedAction-Callable、PrivilegedExceptionAction-Callable 等。具有用于创建不同ThreadPool的静态方法。

ThreadPoolExecutor - 实现ExecutorExecutorService接口 并将任务创建与任务执行分开。我们需要实现Runnable对象并将它们发送给执行器,而ThreadPoolExecutor负责它们的执行、实例化并与线程一起工作。

ScheduledThreadPoolExecutor - 除了ThreadPoolExecutor方法之外,它还创建了一个线程池,可以安排命令在给定延迟后执行或定期执行。

线程工厂是一个按需创建新线程的对象。我们需要将一个实例传递给Executors.newSingleThreadExecutor(ThreadFactory threadFactory)方法。

ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
 @Override public Thread newThread(Runnable r) {
Thread thread = new Thread(r, "MyThread");
thread.setPriority(Thread.MAX_PRIORITY);
 return thread; }
 });

RejectedExecutionHandler - 允许您为由于某种原因无法通过ThreadPoolExecutor执行的任务定义处理程序。当没有空闲流或服务关闭或关闭时会发生这种情况。

ThreadPoolExecutor类中有几个标准实现:

  • CallerRunsPolicy - 在调用线程上运行任务;
  • AbortPolicy - 抛出异常;
  • DiscardPolicy——忽略任务;
  • DiscardOldestPolicy - 从队列中删除最早的未启动任务,然后再次尝试添加新任务。

完工服务

CompletionService是一个服务接口,将启动异步任务和获取结果解耦。添加任务有submit方法,获取已经完成任务的结果使用阻塞take和非阻塞poll

ExecutorCompletionService是任何实现Executor接口的类的包装器,例如ThreadPoolExecutorForkJoinPool。当需要从启动任务和控制其执行的方法中抽象出来时使用。

如果有完成的任务,我们就把它们拉出来。如果没有任务,那么我们会挂起直到完成。该服务在其核心使用 LinkedBlockingQueue,但您可以传入任何 BlockingQueue 实现。