(Java 多线程系列)Java 线程池(Executor)

线程池简介java


   线程池是指管理同一组同构工做线程的资源池,线程池是与工做队列(Work Queue)密切相关的,其中在工做队列中保存了全部等待执行的任务。工做线程(Worker Thread)的任务很简单:从工做队列中获取一个任务,执行任务,而后返回线程池并等待下一个任务。缓存

  线程池简化了线程管理工做,而且java.util.concurrent提供了一种灵活的线程池实现做为Executor框架的一部分。在Java类库中,任务执行的主要抽象不是Thread,而是Executor。虽然Executor是个简单的接口,但它却为灵活且强大的异步任务执行框架提供了基础,访框架能支持多种不一样类型的任务执行策略。它提供了一种标准的方法将任务的提交过程与执行过程解耦出来,并用Runnable来表示任务。框架

  因为Java类库中有Executor来专门用于线程池的管理的类,因此能够用Executor任务执行框架来实现线程池的构建。异步

  Executor基于生产者-消费者模式,提交任务的操做至关于生产者(生成待完成工做单元),执行任务至关于消费者(执行完这个工做单元).基本框架为:spa

 (此图片转载自http://computerdragon.blog.51cto.com/6235984/1212442)线程

 

线程池的建立3d


能够经过调用Executors中的静态工厂方法之一来建立一个线程池:code

  public static ExecutorService newFixedThreadPool(int nThreads)
    建立固定数目线程的线程池,每当提交一个任务时就建立一个线程,直到达到线程池的最大数量,这时线程池的规模将不会再变化(若是某个线程因为发生的Exception而结束,那么线程池会补充一个新的线程)
  public static ExecutorService newCachedThreadPool()
    建立一个可缓存的线程池,调用execute 将重用之前构造的线程(若是线程可用)。若是现有线程没有可用的,则建立一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
  public static ExecutorService newSingleThreadExecutor()
    建立一个单线程化的Executor。
  public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
    建立一个固定长度的线程池,并且以延迟或定时的方式来执行任务,相似于Timer。
blog

 

Executor的生命周期接口


 

  Executor的实现一般会建立线程来执行任务,可是JVM只有在全部(非守护)线程所有终止后才会退出,所以,若是没法正确关闭Executor,那么JVM将没法结束

  因为Executor以异步方式来执行任务,所以在任什么时候候,以前提交任务的状态不是当即可见的。为了解决执行服务的生命周期问题,ExecutorService拓展了Executor接口,添加了一些用于生命周期管理的方法。

 

public interface ExecutorService extends Executor { void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; //....
}

 

  ExecutorService的生命周期有3种运行状态:运行、关闭和已终止。ExecutorService在初始建立时处于运行状态。shutdown方法将执行平缓的关闭过程:再也不接受新的任务,同时等待已经提交的任务执行完成(包括那些还未开始执行的任务)。shutdownNow方法将执行粗暴的关闭过程:它尝试取消全部运行中的任务,而且再也不启动运行队列中还没有开始执行的任务。

  等全部任务都完成后,ExecutorService将转入终止状态。能够调用awaitTermination()来等待ExecutorService到达终止状态,或者经过来轮询ExecutorService是否已经终止。经过在调用awaitTermination以后会当即调用shutdown,从而产生同步地关闭ExecutorService的效果。

  若是要使用Executor,必须将任务表述为一个Runnable。

 

PS:没有具体使用过,后续使用了再具体添加

相关文章
相关标签/搜索