执行者
![](https://cdn.codegym.cc/images/article/83e7f607-1195-4d00-a2b8-f790515dc1a9/800.jpeg)
Executor是实现Runnable任务启动的类的基接口。这有助于添加任务以及如何启动它。
ExecutorService是一个接口,它扩展了Executor 的属性,它描述了用于运行Runnable或Callable任务的服务。提交方法接受Callable或Runnable形式的任务作为,并使用 Future 作为返回值,通过它可以得到结果。
invokeAll方法负责执行任务,返回任务列表及其状态和完成结果。
invokeAny方法负责执行任务,返回成功完成任务的结果(即不抛出异常),如果有的话。
ScheduledExecutorService - 此接口添加了以特定延迟或特定时间段运行挂起任务的能力。
AbstractExecutorService是一个抽象类,用于构造一个 ExecutorService 'a. 里面有submit、 invokeAll、 invokeAny方法的实现。该类继承ThreadPoolExecutor、 ScheduledThreadPoolExecutor和ForkJoinPool。
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();
}
线程池执行器
![](https://cdn.codegym.cc/images/article/2b86fe3b-e258-4219-8c32-7d3ba93670ea/800.jpeg)
Executors是一个用于创建ThreadPoolExecutor、 ScheduledThreadPoolExecutor的工厂类。如果您需要创建其中一个池,那么这个工厂正是您所需要的。它包含不同的适配器 Runnable-Callable、PrivilegedAction-Callable、PrivilegedExceptionAction-Callable 等。具有用于创建不同ThreadPool的静态方法。
ThreadPoolExecutor - 实现Executor和ExecutorService接口 并将任务创建与任务执行分开。我们需要实现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 - 从队列中删除最早的未启动任务,然后再次尝试添加新任务。
完工服务
![](https://cdn.codegym.cc/images/article/52be544f-17a5-406c-9f5f-9864056f87a8/512.jpeg)
CompletionService是一个服务接口,将启动异步任务和获取结果解耦。添加任务有submit方法,获取已经完成任务的结果使用阻塞take和非阻塞poll。
ExecutorCompletionService是任何实现Executor接口的类的包装器,例如ThreadPoolExecutor或ForkJoinPool。当需要从启动任务和控制其执行的方法中抽象出来时使用。
如果有完成的任务,我们就把它们拉出来。如果没有任务,那么我们会挂起直到完成。该服务在其核心使用 LinkedBlockingQueue,但您可以传入任何 BlockingQueue 实现。
GO TO FULL VERSION