Java的executorservice_java多线程之Executor 与 ExecutorService两个基本接口

本文介绍了Executor接口的基本概念,探讨了其三种主要执行原理,包括直接执行、线程池执行和序列执行。随后深入讲解了ExecutorService接口,强调其对任务管理和终止的支持,以及常用的Future和批量操作方法。
摘要由CSDN通过智能技术生成

一、Executor 接口简介

Executor接口是Executor框架的一个最基本的接口,Executor框架的大部分类都直接或间接地实现了此接口。

只有一个方法

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

public interfaceExecutor {/*** Executes the given command at some time in the future. The command

* may execute in a new thread, in a pooled thread, or in the calling

* thread, at the discretion of the {@codeExecutor} implementation.

*

*@paramcommand the runnable task

*@throwsRejectedExecutionException if this task cannot be

* accepted for execution

*@throwsNullPointerException if command is null*/

voidexecute(Runnable command);

}

Executor的几种实现原理介绍:

1、 Executor 接口并没有严格地要求执行是异步的。在最简单的情况下,执行程序可以在调用者的线程中立即运行已提交的任务:

class DirectExecutor implementsExecutor {public voidexecute(Runnable r) {

r.run();

}

}

2、 更常见的是,任务是在某个不是调用者线程的线程中执行的。以下执行程序将为每个任务生成一个新线程。

class ThreadPerTaskExecutor implementsExecutor {public voidexecute(Runnable r) {newThread(r).start();

}

}

3、 许多 Executor 实现都对调度任务的方式和时间强加了某种限制。以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。

class SerialExecutor implementsExecutor {private final Queue tasks = new ArrayDeque();private finalExecutor executor;

Runnable active;

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

}public synchronized void execute(finalRunnable r) {

tasks.offer(newRunnable() {public voidrun() {try{

r.run();

}finally{

scheduleNext();

}

}

});if (active == null) {

scheduleNext();

}

}protected synchronized voidscheduleNext() {if ((active = tasks.poll()) != null) {

executor.execute(active);

}

}

}

二、ExecutorService 接口简介

ExecutorService 是一个接口,提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future 的方法。

ExecutorService 的实现:

三个实现类:AbstractExecutorService(默认实现类) , ScheduledThreadPoolExecutor, ThreadPoolExecutor

Executors 提供了此接口的几种常用实现的工厂方法。

1. 从Executor 接口中继承了不跟踪异步线程,没有返回的 execute 方法:

void execute(Runnable command);

2.扩展的跟踪异步线程、返回Future 接口的实现类的方法:

public interface ExecutorService extendsExecutor {//启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。

voidshutdown();//试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 无法保证能够停止正在处理的活动执行任务,但是会尽力尝试。例如,在 ThreadPoolExecutor 中,通过 Thread.interrupt() 来取消典型的实现,所以如果任务无法响应中断,则永远无法终止。

ListshutdownNow();//如果此执行程序已关闭,则返回 true。

booleanisShutdown();//如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。

booleanisTerminated();//一直等待,直到所有任务完成。请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行,或者超时时间的到来如果此执行程序终止,则返回 true;如果终止前超时期满,则返回 false

boolean awaitTermination(longtimeout, TimeUnit unit)throwsInterruptedException;//提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。该 Future 的 get 方法在成功完成时将会返回该任务的结果。如果想立即阻塞任务的等待,则可以使用 result = exec.submit(aCallable).get(); 形式的构造

Future submit(Callabletask);//提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功完成时将会返回给定的结果。

Futuresubmit(Runnable task, T result);//提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。该 Future 的 get 方法在成功 完成时将会返回 null。

Future>submit(Runnable task);//执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。

List> invokeAll(Collection extends Callable>tasks)throwsInterruptedException;//超时等待,同上。

List> invokeAll(Collection extends Callable>tasks,longtimeout, TimeUnit unit)throwsInterruptedException;//与 invokeAll的区别是,任务列表里只要有一个任务完成了,就立即返回。而且一旦正常或异常返回后,则取消尚未完成的任务。

T invokeAny(Collection extends Callable>tasks)throwsInterruptedException, ExecutionException;//超时等待,同上。

T invokeAny(Collection extends Callable>tasks,longtimeout, TimeUnit unit)throwsInterruptedException, ExecutionException, TimeoutException;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值