【Java并发编程】Executor Interfaces

来源:互联网 发布:通达信原油看盘软件 编辑:程序博客网 时间:2024/06/05 22:38

总括

在java.util.concurrent包下,定义了三个Executor Interfaces。
1. Executor接口,一个简单的接口,支持启动一个新任务。
2. ExecutorService接口,继承了Executor接口,提供了管理任务和Executor本身生命周期的相关定义。
3. ScheduledExecutorService,继承了ExecutorService,提供了周期性执行任务的机制的接口的定义

Executor接口

public interface Executor {    void execute(Runnable command);}

Executor接口只有一个execute方法,该接口是设计来直接可以替换Thread的方式的。这里r为Runnable类,e为Executor接口的一个实例,具体是什么我们这里不关心。

(new Thread(r)).start();
e.execute(r);

可以看出,Executor的定义没有什么特别的。我们一定要明白一点,当我们最初使用Thread来执行一个Runnable任务时,Runnable本身和多线程一点关系都没有,它只是被Thread利用的一个接口而已,真正的具备线程的功能是Thread类。回过头来,我们再说Executor接口,这个接口就如同Runnable接口一样,并没有什么神奇之处,这个接口本身不是线程,而是线程利用的一个已知的接口而已。换句话说,如果Executor的实例实在哪一个线程中调用了execute方法,那么相应的任务就运行在那个线程。

ExecutorService接口

public interface ExecutorService extends Executor {    void shutdown();    List<Runnable> shutdownNow();    boolean isShutdown();    boolean isTerminated();    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;    <T> Future<T> submit(Callable<T> task);    <T> Future<T> submit(Runnable task, T result);    Future<?> submit(Runnable task);    ··· ···}

ExecutorService提供了一种执行任务的新方式,submit方法接受一个Callable的实例,我们熟悉的Runnable接口中定义的方法run并不反回任何参数,而Callable接口中定义的方法call是有返回值的。submit方法返回值是Future接口,Future接口定义了任务调度的逻辑,和获取Callable对应执行结果的相关get方法。

ExecutorService提供了关闭Executor的方法,要想立刻关闭,所有的任务都要很好地处理中断操作。

ScheduledExecutorService接口

ScheduledExecutorService接口比ExecutorService提供了延迟和周期性反复执行任务的接口:scheduleAtFixedRate和scheduleWithFixedDelay。