java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor在客户端和执行任务之间提供了一个间接层,Executor代替客户端执行任务。Executor允许你管理异步任务的执行,而无须显式地管理线程的生命周期。
public interface Executor { void execute(Runnable command);}ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态,运行 ,关闭 ,终止 。
public interface ExecutorService extends Executor { //关闭线程池,不允许新的任务,但正在等待的任务会被执行。 void shutdown(); //关闭线程池,试图停止正在执行的任务,不允许新的任务,抛弃正在等待的任务并返回。 List<Runnable> shutdownNow(); //线程池是否已经关闭 boolean isShutdown(); //线程池是否终止(所有线程都已经关闭) boolean isTerminated(); //阻塞等待一段时间直到线程池被终止或超时或发生中断异常 boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; //提交一个任务,返回任务的future对象,可以知道任务的执行情况 Future<T> submit(Callable<T> task); //同上 Future<T> submit(Runnable task, T result); //同上 Future<?> submit(Runnable task); //批量执行任务,全部执行完再返回 List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; //批量执行任务,全部执行完或超时了就返回 List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; //批量执行任务,成功完成一个就返回 T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; //批量执行任务,成功完成一个或超时就返回 T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;}ThreadPoolExecutor是ExecutorService的一个实现类,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。
Executors类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads) 创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool() 创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor() 创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
新闻热点
疑难解答