[JDK翻译][Executor][ExecutorService]

本文介绍了Executor接口的概念及其在任务调度中的应用,展示了如何通过Executor来解耦任务提交与执行方式,并探讨了FutureTask的使用方法及特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Executor

执行提交的Runnable任务的对象。此接口提供了一种将任务提交与每个任务运行方式的机制解耦的方法,包括线程使用、调度等的详细信息。通常使用Executor而不是显式创建线程。例如,您可以使用:

 Executor executor = anExecutor;
   executor.execute(new RunnableTask1());
   executor.execute(new RunnableTask2());

但是,Executor接口并不严格要求执行是异步的。在最简单的情况下,执行器可以立即在调用者的线程中运行提交的任务:

public class DirectExecutor implements Executor {
    @Override
    public void execute(Runnable command) {
        command.run();
    }
}

更典型的是,任务在调用者线程以外的某个线程中执行。下面的Executor为每个runnable任务生成一个新线程。

public class DirectExecutor implements Executor {
    @Override
    public void execute(Runnable r) {
        new Thread(r).start();
    }
}

许多Executor实现对任务的调度方式和时间施加了某种限制。下面的执行器将任务提交到第二个执行器,说明了复合执行器。

class SerialExecutor implements Executor {
    final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
    final Executor executor;
    Runnable active;

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

    public synchronized void execute(final Runnable r) {
        tasks.offer(new Runnable() {
            public void run() {
                try {
                    r.run();
                } finally {
                    scheduleNext();
                }
            }
        });
        if (active == null) {
            scheduleNext();
        }
    }

    protected synchronized void scheduleNext() {
        if ((active = tasks.poll()) != null) {
            executor.execute(active);
        }
    }
}

ExecutorService  是一种Executor,提供了关闭shutdown功能,提供了可以为异步任务生成future的方法。可以关闭ExecutorService,这将导致它拒绝新任务。提供了两种不同的关闭ExecutorService的方法。shutdown()方法将允许以前提交的任务在终止之前执行,而shutdownNow()方法则防止等待任务启动并尝试停止当前正在执行的任务。终止时,执行器没有正在执行的任务,没有等待执行的任务,也不能提交新的任务。应关闭未使用的ExecutorService,以允许回收其资源。

提供submit方法,

<T> Future<T> submit(Callable<T> task);

提交一个有返回值的任务执行,返回一个future的结果,可以利用future.get获取结果;如果你想阻塞的等待线程执行完毕可以使用:

exec.submit(aCallable).get();

submit方法是对exectute的扩展,提供了future 可以用来cancel execution和等待执行。

参考实现类AbstractExecutorService

FutureTask

可取消的异步计算A cancellable asynchronous computation。此类提供了Future的基本实现,其中包含启动和cancel计算、查询以查看计算是否完成以及检索计算结果的方法。只有在计算完成时才能检索结果;如果计算尚未完成,get方法将阻塞。计算完成后,无法重新启动或取消计算(除非使用

runAndReset()调用计算)。
FutureTask可用于包装Callable或Runnable对象。由于FutureTask实现了Runnable,因此可以将FutureTask提交给Executor执行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值