新的任务执行架构
在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,假如你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ExecutorService和ScheduledExecutorService,让我们先用一个图来显示它们的关系:
图的左侧是接口,图的右侧是这些接口的具体类。注重Executor是没有直接具体实现的。
Executor接口:
是用来执行Runnable任务的,它只定义一个方法:
ExecutorService接口:
ExecutorService继续了Executor的方法,并提供了执行Callable任务和中止任务执行的服务,其定义的方法主要有:
public class ScheduledExecutorServiceTest { public static void main(String[] args) throws InterruptedException, ExecutionException { // *1 ScheduledExecutorService service = Executors.newScheduledThreadPool(2); // *2 Runnable task1 = new Runnable() { public void run() { System.out.println("Task repeating."); } }; // *3 final ScheduledFuture future1 = service.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS); // *4 ScheduledFuture future2 = service.schedule(new Callable() { public String call() { future1.cancel(true); return "task cancelled!"; } }, 5, TimeUnit.SECONDS); System.out.println(future2.get()); // *5 service.shutdown(); } }
ScheduledExecutorService接口
在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:
Executors类
虽然以上提到的接口有其实现的具体类,但为了方便Java 5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注重的是Executors是一个类,不是Executor的复数形式。Executors提供了以下一些static的方法: