Java经过Executors提供四种线程池,分别为:算法
ThreadPoolExecutor中定义了如下几个重要属性:缓存
corePoolSize:池中所保存的线程数,包括空闲线程。 maximumPoolSize:线程池中的最大线程数量。 keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间,超过corePoolSize的空闲线程,在多长时间内会被销毁。 TimeUnit unit:KeepAliveTime 参数的时间单位。 BlockingQueue<Runnable> workQueue:任务队列,被提交的但还没有被执行的任务。 workQueue主要有如下几种实现类型 1). SynchronousQueue:直接提交的队列,该队列没有容量,每个擦入操做都要对应一个相应的删除操做,反之每一个删除操做对应相应的插入操做。 SynchronousQueue不保存任务,它老是将任务提交给线程执行,若是没有空闲的进程,则尝试建立新的进程,若是进程已达到maximumPoolSize设置的最大线程数,则执行拒绝策略 2). ArrayBlockingQueue:有界任务队列,ArrayBlockingQueue的构造函数必须带一个容量参数(例如n),表示该队列的最大容量。当有新任务执行时,这个定义当前线程数为t,构造函数的容量参数为n,当前队列长度为l 1.t<corePoolSize时,建立新的线程之心 2.t>corePoolSize且l<n时,插入到任务队列,等待空闲线程执行 3.t>corePoolSize且l>=n时,建立新的线程执行新任务 4.t>maximumPoolSize时,执行拒绝策略。并发
3). LinkedBlockingQueue:无界任务队列,当有新任务执行时,若是线程池中线程数小于corePoolSize则建立新的线程,不然进入队列等待。若是没有任务建立速度和处理速度差别很大,无界队列会保持快速增加,直到耗尽系统内存 4). PriorityBlockingQueue: 优先级队列,能够控制任务的执行前后顺序,是一个特殊的无界队列。不管有界的队列无界的队列,都是按照先进先出算法处理任务(絮叨),而该队列破例能够根据任务自身的优先级顺序前后执行。函数
JDK内置的拒绝策略以下: AbortPolity策略:该策略会直接抛出异常,阻止系统正常工做 CallerRunsPolity策略:只要线程为关闭,该策略直接在调用者线程中,运行当前被丢弃的任务 DiscardOledstPolicy策略:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。 DiscardPlicy 策略:该策略默默的丢弃没法处理的任务,不予任务处理。 若是以上策略不能知足实际应用需求,能够扩展RejectedExecutionHandler 接口 public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor); } 其中,r为请求执行的任务,executor为当前线程池。线程