ThreadPoolExecutor笔记

class ThreadPoolExecutor 异步

    extends AbtractExecutorService spa

    能提高大量异步任务的执行效率,提供了线程等资源的管理,而且维护了一些基本的统计信息。 线程

    两个重要的参数:corePoolSizemaximumPoolSize。当一个任务被提交时,若是正在运行的线程数少于corePoolSize,无论线程是否空闲,则建立新的线程处理该任务请求;若是线程数大于corePoolSize,且小于maximumPoolSize,只有在任务队列已满时才建立新的线程。设置corePoolSize==maximumPoolSize,能够建立一个固定大小的线程池;也能够设置maximumPoolSizeInteger.MAX_VALUErest

    默认只有新任务来的时候才会建立和启动线程,也能够经过重写方法prestartCoreThreadprestartAllCoreThreads,能够用一个非空的队列来在线程池建立的时候预启动线程。 队列

    线程的建立默认是经过defaultThreadFactory,被建立的线程有相同的优先级(NORM_PRIORITY),线程工厂指定的线程名,相同的线程组,非守护线程等。用户能够实现本身的ThreadFactory来指定上述属性。线程必须有“modifyThread”运行时权限,若是没有该权限,一些服务将没法使用,如运行时的配置改变没法生效,线程池关闭不必定成功等。 资源

    若是线程池当前的线程数大于corePoolSize,多余的线程在空闲时间超过keepAliveTime后会被终止;若是设置allowCoreThreadTimeOut(true),则该限制也一样应用于core threadsget

    使用BlockingQueue来存听任务队列。当新任务来时: it

    1. 若是小于corePoolSize的线程数执行,则建立新线程; io

    2. 若是大于等于corePoolSize的线程数执行,则新任务添加到队列中; class

    3. 若是任务请求没法添加到队列中,建立新线程,当超过maximumPoolSize时任务会被拒绝。

一般有三种任务队列策略:

    1. SynchronousQueue:不保存任务,直接将任务提交线程处理。能够避免一组相互依赖的请求内部可能出现的锁。一般要求设置maximumPoolSize为最大;

    2. LinkedBlockingQueue:队列无最大上限。建立的线程数不会超过corePoolSizemaximumPoolSize在这种状况下不起做用。适合相互独立的线程,能够用来缓冲突发的大量请求;

    3. ArrayBlockingQueue:使用有限的maximumPoolSize,避免资源的耗尽;但协调和控制的难度增大,须要在队列大小和线程池大小之间作平衡。使用大的队列和小的线程池,能够最小化cpu使用和系统资源,以及上下文切换消耗,但致使低吞吐量。若是任务频繁的阻塞(如I/O),系统能够分配比用户容许的更多的线程时间。使用小的队列一般要求大的线程池,能够保持CPU忙碌,但可能带来更大的调度开销,以至于较低吞吐量。

    当线程池已经关闭,或者使用了有限的maximumPoolSize和队列而且已饱和,则新的任务将会被拒绝。这时将调用rejectedExecution。有四种预约义的线程拒绝策略:

    1. ThreadPoolExecutor.AbortPolicy,抛出RejectedExecutionException

    2. ThreadPoolExecutor.CallerRunsPolicy,(the thread that invokes execute itself runs the task)提供了一种简单的反馈控制机制来下降任务提交的频率;

    3. ThreadPoolExecutor.DiscardPolicy,任务被抛弃;

    4. ThreadPoolExecutor.DiscardOldestPolicy,队列顶端的任务被抛弃,而且重试任务执行;

    除了预约义,也能够定义和使用其它类型的RejectedExecutionHandler

    同时提供了可被重写的方法beforeExecuteafterExecute,用于控制运行环境。此外terminated能够被重写,用于线程池中止时须要处理的过程。若是hook或回调方法执行过程当中抛出异常,则内部的worker线程可能运行失败而且意外终止。


abstract class AbstractExecutorService

        implements ExecutorService

     ExecutorService的默认实现。

    经过newTaskFor实现了submitinvokeAllinvokeAny


interface ExecutorService

        implements Executor

    shutdown容许以前提交的任务在停止以前执行完成,再也不接受新任务,但不等待任务执行完成;

    shutdownNow而且尝试中止当前执行的任务,阻止等待的任务执行,返回等待执行的任务列表,不保证必定可以关闭执行中的任务(例如调用interrupt中断线程有可能失败);

    isShutdown:

    isTerminated: 调用shutdown/shutdownNow以后,若是全部任务都完成了则返回true

    awaitTermination(timeout,unit): shutdown请求后,阻塞到全部任务都执行完成或者超时,或者当前线程被中断。若是是超时,返回false,若是该executor停止返回true

    <T> Future<T> submit(Callable<T> task): Future模式,提交后返回一个Future,经过调用Futureget方法获取实际任务成功执行的返回值;

    <T> Future<T> submit(Runnable taskT result):

    Future<?> submit(Runnable task);

    invokeAll(tasks): 执行给定的一组任务,返回Future


interface Executor

    将任务提交与任务执行的机制解耦。不显式的建立线程,而是用例如executor.execute(new RunnableTask1());的形式。

    不严格要求异步执行,能够直接在调用者线程中执行:

class DirectExecutor implements Executor {

    public void execute(Runnable r) {

        r.run();

    }

}

但一般是为每一个任务开启一个新的线程。

class ThreadPerTaskExecutor implements Executor {

    public void execute(Runnable r) {

        new Thread(r).start();

    }

}

    Executor只有一个execute(Runnable command);方法,要求若是任务不能被接受执行,则抛出RejectedExecutionException,若是commandnull,抛出NullPointerException异常。

相关文章
相关标签/搜索