Java.util.concurrent之 Executor框架与线程池

Executor的继承树关系:

Java.util.concurrent之 Executor框架与线程池

Executor框架是java 5 中引入的,内部使用了线程池机制。Executor框架包括:Executor, ExecutorService,Executors,ThreadPoolExecutor等。

Executor ——接口

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

Executor接口中定义一个方法execute(Runnable command),该方法接收一个Runnable实例,它用来执行一个任务,任务即是一个实现了Runnable接口的类。

ExecutorService——接口

public interface ExecutorService extends Executor {
  void shutdown();
  List<Runnable> shutdownNow();
  boolean isShutdown();
  boolean isTerminated();
  boolean awaitTermination(long timeout, TimeUnit unit)
    throw InterruptedException;
  //...其他用于提交的便利方法
}

ExecutorService继承了Executor的接口,同时提供了更丰富的生命周期管理的方法。ExecutorService的生命周期有3种状态:运行、关闭和已停止。

shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成——包括哪些还未开始执行的任务。

shutdownNow方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。

Executors提供工厂方法用于创建线程池
newFixedThreadPool:将创建固定长度的线程池,每提交一个任务就创建一个线程,直到达到线程池的最大数量。(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)。
newCachedThreadPool:创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制。
newSingleThreadPool:是一个单线程的Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。newSingleTreadPool能确保依照任务在队列中的顺序来串行执行(例如FIFO、LIFO、优先级)
newScheduledThreadPool:创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务。
ThreadPoolExecutor
ThreadPoolExecutor为一些Executor提供了基本的实现,这些Executor是由Executors中newCachedThreadPool、newFixedThreadPool等方法返回的。ThreadPoolExecutor是一个灵活的、稳定的线程池,允许进行各种定制。
 

public ThreadPoolExecutor(int corePoolSize,//线程池的基本大小
                          int maximumPoolSize,//最大大小
                          long keepAliveTime,//存活时间
                          Timeout unit,
                          SlockingQueue<Runable> workQueue,
                          ThreadFactory threadFactory,
                          RejectExecutionHandler handler){...}

通过调节线程池的基本大小和存活时间,可以帮助线程池回收空闲线程占有的资源。

newFixedThreadPool工厂方法将线程池的基本大小和最大大小设置为参数中指定的值,而且创建的线程池不会超时。
newCachedThreadPool工厂方法将线程池的最大大小设置为Integer.MAX_VALUE,而将基本大小设置为零,并将超时设置为1分钟,这种方式创建出来的线程池可以无限扩展,并且当需求降低会自动收获。
 

//对通过标准工厂方法创建的Executor进行修改
ExecutorService exec = Execoutors.newCachedThreadPool();
if(exec instanceof ThreadPoolExecutor)
  ((ThreadPoolExecutor) exec).setCorePoolSize(10);
else
  throw new AssertionError(*Oops, bad assumption);

 

上一篇:Java 线程知识笔记 (四) Executor与ThreadPool 其二


下一篇:java – 为什么ExecutorService.awaitTermination()在提交的任务完成之前成功