//他是ExecutorService的部分实现
public abstract class AbstractExecutorService implements ExecutorService
//提交一个Runnable任务给AbstractExecutorService执行返回Future
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}
//提交一个Runnable任务并指定返回值给AbstractExecutorService执行返回Future
public <T> Future<T> submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
//提交一个Callable任务并指定返回值给AbstractExecutorService执行返回Future
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
//一旦有任务执行成功就返回
public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException {
try {
return doInvokeAny(tasks, false, 0);
} catch (TimeoutException cannotHappen) {
assert false;
return null;
}
}
private <T> T doInvokeAny(Collection<? extends Callable<T>> tasks,
boolean timed, long nanos)
throws InterruptedException, ExecutionException, TimeoutException {
if (tasks == null)
throw new NullPointerException();
int ntasks = tasks.size();
if (ntasks == 0)
throw new IllegalArgumentException();
List<Future<T>> futures= new ArrayList<Future<T>>(ntasks);
ExecutorCompletionService<T> ecs =
new ExecutorCompletionService<T>(this);
try {
ExecutionException ee = null;
long lastTime = timed ? System.nanoTime() : 0;
Iterator<? extends Callable<T>> it = tasks.iterator();
//将任务加入到futures集合中
futures.add(ecs.submit(it.next()));
--ntasks;
int active = 1;
for (;;) {
//获取Future
Future<T> f = ecs.poll();
//当前没有完成的任务
if (f == null) {
//还有任务未提交
if (ntasks > 0) {
--ntasks;
//再提交一个任务
futures.add(ecs.submit(it.next()));
++active;
}
//没有活动的任务重新循环
else if (active == 0)
break;
//如果有超时
else if (timed) {
f = ecs.poll(nanos, TimeUnit.NANOSECONDS);
//超时抛出异常
if (f == null)
throw new TimeoutException();
long now = System.nanoTime();
nanos -= now - lastTime;
lastTime = now;
}
else
//都没有则阻塞获取Future
f = ecs.take();
}
if (f != null) {
--active;
try {
return f.get();
} catch (ExecutionException eex) {
ee = eex;
} catch (RuntimeException rex) {
ee = new ExecutionException(rex);
}
}
}
if (ee == null)
ee = new ExecutionException();
throw ee;
} finally {
for (Future<T> f : futures)
//尝试取消完成的任务
f.cancel(true);
}
}
//一旦有任务执行成功就返回,超时抛出异常
public <T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
return doInvokeAny(tasks, true, unit.toNanos(timeout));
}
//执行所有Futrue返回完成任务的Future列表
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException {
if (tasks == null)
throw new NullPointerException();
List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
boolean done = false;
try {
for (Callable<T> t : tasks) {
RunnableFuture<T> f = newTaskFor(t);
futures.add(f);
execute(f);
}
for (Future<T> f : futures) {
//如果任务还没有完成
if (!f.isDone()) {
try {
//获取
f.get();
} catch (CancellationException ignore) {
} catch (ExecutionException ignore) {
}
}
}
done = true;
return futures;
} finally {
//如果没有任务完成,尝试取消Future
if (!done)
for (Future<T> f : futures)
f.cancel(true);
}
}
//执行所有任务返回所有未超时并且执行了的任务
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException {
if (tasks == null || unit == null)
throw new NullPointerException();
long nanos = unit.toNanos(timeout);
List<Future<T>> futures = new ArrayList<Future<T>>(tasks.size());
boolean done = false;
try {
for (Callable<T> t : tasks)
futures.add(newTaskFor(t));
long lastTime = System.nanoTime();
Iterator<Future<T>> it = futures.iterator();
while (it.hasNext()) {
execute((Runnable)(it.next()));
long now = System.nanoTime();
nanos -= now - lastTime;
lastTime = now;
//超时了直接返回
if (nanos <= 0)
return futures;
}
for (Future<T> f : futures) {
//如果任务还为完成
if (!f.isDone()) {
//超时了直接返回
if (nanos <= 0)
return futures;
try {
f.get(nanos, TimeUnit.NANOSECONDS);
} catch (CancellationException ignore) {
} catch (ExecutionException ignore) {
} catch (TimeoutException toe) {
//超时异常直接返回
return futures;
}
long now = System.nanoTime();
nanos -= now - lastTime;
lastTime = now;
}
}
done = true;
return futures;
} finally {
//所有任务并没有全部返回(可能抛出异常等)
if (!done)
for (Future<T> f : futures)
f.cancel(true);
}
}
分享到:
相关推荐
`AbstractExecutorService`是Java并发编程中的一个关键抽象类,它是`ExecutorService`接口的一个实现基础。`ExecutorService`接口是`java.util.concurrent`包的一部分,用于管理和控制线程的执行,提供了一种将任务...
`AbstractExecutorService`是Java并发工具包`java.util.concurrent`中的一个抽象类,它提供了`ExecutorService`接口的基本实现框架。`ExecutorService`接口是`Executor`接口的一个扩展,主要负责管理和控制线程的...
在Java中,线程池的核心组件主要包括四个部分:`Executor`接口、`ExecutorService`接口、`AbstractExecutorService`抽象类以及`ThreadPoolExecutor`实现类。此外,`Executors`工具类提供了方便的线程池创建方法。 1...
在上面的代码中,我们继承了 AbstractExecutorService 类,并添加了一个 taskCancelledAtShutdown 集合来存储那些已经开始执行但是没有执行完毕的任务。在 execute() 方法中,我们使用 finally 语句来判断任务是否...
Java中提供了一个名为Executor框架的线程池管理框架,该框架包括Executor、ExecutorService、AbstractExecutorService和ThreadPoolExecutor等接口和类。Executor是一个基本的接口,提供了execute方法来执行Runnable...
AbstractExecutorService 抽象类继承 ExecutorService 接口,对 ExecutorService 相关方法提供了默认实现,用 RunnableFuture 的实现类 FutureTask 包装 Runnable 任务,交给 execute() 方法执行,然后可以从该 ...
* AbstractExecutorService是Java中的抽象线程池类,提供了execute()和submit()方法的默认实现。 七、高并发编程的其他知识点 * volatile关键字可以确保变量的可见性和原子性。 * synchronized关键字可以确保方法...
在并发编程中,`AbstractExecutorService`是`ExecutorService`的一个抽象实现,提供了管理和控制线程池的方法。`AbstractInterruptibleChannel`代表可以被中断的通道,是NIO的一部分。`AbstractQueuedSynchronizer`...
线程池中的重要顶层接口和抽象类,如ExecutorService、AbstractExecutorService和ScheduledExecutorService,提供了基础的线程池服务和调度功能。这些接口和抽象类为开发者构建和定制线程池提供了灵活性,可以根据...
5. **并发编程**:AbstractExecutorService、AbstractInterruptibleChannel和AbstractQueuedSynchronizer等类是Java并发库的核心组件,它们支持线程池、通道操作和同步原语。 6. **文档模型**:AbstractDocument...
- AbstractExecutorService 抽象类进一步简化了 ExecutorService 的实现。 - ThreadPoolExecutor 是具体实现类,负责管理和调度线程。 - ScheduledExecutorService 提供了定时和周期性任务的执行能力。 了解并...
在实际应用中,还可以自定义线程池实现,例如继承`AbstractExecutorService`或实现`ExecutorService`接口,以满足特定的业务需求。例如,可以定制线程的优先级、线程的命名规则、异常处理策略等。 总的来说,线程池...
- **创建线程池的方式**:Java中可通过`Executors`工厂类或直接继承`AbstractExecutorService`实现自定义线程池。 - **线程安全问题**:线程安全是指在多线程环境下,代码能够正确处理并发访问,不会导致数据不...
ForkJoinPool是这个框架的核心组件,它扩展了AbstractExecutorService类,并实现了工作窃取算法。工作窃取算法允许工作线程在自己的任务队列为空时,从其他线程的任务队列中偷取任务来执行,这样可以更高效地利用...
`AbstractExecutorService`是`ExecutorService`的抽象类,提供了线程池服务的基本实现。`AbstractInterruptibleChannel`是可中断通道的抽象类,允许在读写操作时被中断。`AbstractLayoutCache`和`...
19. **AbstractExecutorService**:提供了ExecutorService执行方法的默认实现,是线程池服务的基础。 20. **AbstractHttpClient**:这是HttpClient的便利基类,用于HTTP客户端的实现,简化了网络请求的处理。 21. ...
该类继承自`AbstractExecutorService`,实现了线程池的主要功能。 **构造方法详解**: ```java public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
AbstractExecutorService是一个抽象类,实现了ExecutorService接口,并提供了一些默认实现,以便于子类进行更具体的实现。 ThreadPoolExecutor是一个核心的线程池实现,它通过线程池参数配置来管理执行任务。它实现...
public abstract class AbstractExecutorService implements ExecutorService { ... public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T>...