线程池总结

线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处:
1、降低资源消耗,减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务;
2、提高响应速度;
3、提高线程的可管理性,对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。

Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。

Executor是一个接口,只有execute(Runnable runnable)方法。
ExecutorService是一个接口,extends Executor ,有submit(Callable callable)和submit(Runnable runnable)等等方法。
Executors是java线程池的工厂类,通过它可以快速定义一个线程池,本质上还是通过不同的参数初始化一个ThreadPoolExecutor对象,ThreadPoolExecutor实现Executor接口。

ExecutorService threadPool = Executors.newFixedThreadPool(3);
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
 	}
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

参数意义:
corePoolSize
线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程;
核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。
maximumPoolSize
线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize。
keepAliveTime
线程空闲时的存活时间,即当线程没有任务执行时,继续存活的时间;默认情况下,该参数只在线程数大于corePoolSize时才有用;当将allowCoreThreadTimeOut设置为true时对corePoolSize生效。
unit
keepAliveTime的单位。
workQueue
用来保存等待被执行的任务的阻塞队列,且任务必须实现Runable接口,在JDK中提供了如下阻塞队列:
1、ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务;
2、LinkedBlockingQueue:基于链表结构的阻塞队列,按FIFO排序任务,吞吐量通常要高于ArrayBlockingQueue;
3、SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue;
4、priorityBlockingQuene:具有优先级的无界阻塞队列;
threadFactory
线程工厂,提供创建新线程的功能,通过自定义的线程工厂可以给每个新建的线程设置一个具有识别度的线程名。
RejectedExecutionHandler
拒绝策略,表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。
ThreadPoolExecutor.AbortPolicy(默认):丢弃任务,并抛出RejectedExecutionException拒绝执行异常。
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 。
RejectedExecutionHandler也是一个接口,只有一个方法
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable var1, ThreadPoolExecutor var2);
}
当线程池中的资源已经全部使用,添加新线程被拒绝时,会调用RejectedExecutionHandler的rejectedExecution方法。

4种线程池

//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
ExecutorService threadPool1 = Executors.newSingleThreadExecutor();//实例:ThreadPoolExecutor workQueue:LinkedBlockingQueue

//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService threadPool2 = Executors.newFixedThreadPool(3);//实例:ThreadPoolExecutor workQueue:LinkedBlockingQueue

//创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,
//此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
ExecutorService threadPool3 = Executors.newCachedThreadPool();//实例:ThreadPoolExecutor workQueue:SynchronousQueue

//创建一个定长线程池,支持定时及周期性任务执行。
ScheduledExecutorService threadPool4 = Executors.newScheduledThreadPool(3);//实例:ScheduledThreadPoolExecutor workQueue:DelayedWorkQueue

上述创建4种线程池本质上还是通过不同的参数初始化一个ThreadPoolExecutor对象:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

最上层Executor(接口,只有一个void execute(Runnable command)方法),ExecutorService(接口,对线程池定义的一个接口,对ExecutorService接口的实现有两个 ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个是java线程池的具体实现类) extends Executor。

AbstractExecutorService(抽象类)implements ExecutorService。
ScheduledExecutorService(接口) extends ExecutorService。
ThreadPoolExecutor(类)extends AbstractExecutorService。
ScheduledThreadPoolExecutor(类) extends ThreadPoolExecutor implements ScheduledExecutorService。

Executors只是一个工厂类,它所有的方法返回的都是ThreadPoolExecutor、ScheduledThreadPoolExecutor这两个类的实例,可以创建上述4种线程池。

关系图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值