线程池

线程池的好处:

①重复利用已建立的线程,减少线程创建和销毁的消耗。

②提高效率,不用等待线程创建,直接利用已经创建好的线程

③更容易管理线程

ThreadPoolExecutor

构造函数

corePoolSize, 核心线程数,线程池已有线程数未达到之前会一直创建新线程,达到后会放到阻塞队列里,

maximumPoolSize, 最大线程数

keepAliveTime, 线程空余时间,超过后消亡

unit, 空余时间的单位

workQueue,任务队列,放满后会去启动新线程(未达到maximumPoolSize),达到maximumPoolSize会走拒绝策略

ThreadFactory,默认线程工厂

defaultHandler,拒绝策略

(1)AbortPolicy:直接抛出异常,默认策略;

(2)CallerRunsPolicy:用调用者所在的线程来执行任务;

(3)DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;

(4)DiscardPolicy:直接丢弃任务;

当然也可以根据应用场景实现RejectedExecutionHandler接口,自定义饱和策略,如记录日志或持久化存储不能处理的任务。

 

预定义的线程池,通过Executors工厂类去实现具体的线程池

FixedThreadPool

    ExecutorService ex = Executors.newFixedThreadPool(nThreads)

    ex.submit()(可以有返回值)

    创建使用固定线程数的FixedThreadPool的API。适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器。FixedThreadPool的corePoolSize和maximumPoolSize都被设置为创建FixedThreadPool时指定的参数nThreads。

    当线程池中的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的

    最长时间,超过这个时间后多余的线程将被终止。这里把keepAliveTime设置为0L,意味着多余的空闲线程会被立即终止。

FixedThreadPool使用有界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。

SingleThreadExecutor

    创建使用单个线程的SingleThread-Executor的API,于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。

    corePoolSize和maximumPoolSize被设置为1。其他参数与FixedThreadPool相同。SingleThreadExecutor使用有界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)

CachedThreadPool

    创建一个会根据需要创建新线程的CachedThreadPool的API。大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者是负载较轻的服务器。

    corePoolSize被设置为0,即corePool为空;maximumPoolSize被设置为Integer.MAX_VALUE。这里把keepAliveTime设置为60L,意味着CachedThreadPool中的空闲线程等待新任务的最长时间为60秒,空闲线程超过60秒后将会被终止。

    FixedThreadPool和SingleThreadExecutor使用有界队列LinkedBlockingQueue作为线程池的工作队列。CachedThreadPool使用没有容量的SynchronousQueue作为线程池的工作队列,但CachedThreadPool的maximumPool是无界的。这意味着,如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程。极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。

你可能感兴趣的:(多线程)