Java 线程池汇总

背景:

在开发服务器端软件项目时,软件常常需要处理执行时间很短而数目非常巨大的需求。如果为每个请求创建一个新线程,会导致性能上的瓶颈,因为线程对象的创建和销毁需要JVM频繁的进行处理,若这样则系统性能大幅度降低。
在JDK1.5中提供了线程池的支持,主要作用是支持高并发的处理,并且可以将线程对象进行复用。核心原理即创建一个运行效率比较优异的线程次TreadPool,在池子中支持线程的管理,包括创建与销毁,使用池时只需要执行具体的任务即可,线程对象的处理都在池中被封装了。

Executor接口介绍:

Executor在英语单词里的意思有:执行者的意思。与线程次有关的大部分类都是实现了
java.util.concurrent.Executor 接口;

线程池分类:

1、无界线程池【newCachedThreadPool】:

Cached在英语单词里有储藏的意思。
newCachedThreadPool()方法表示创建无界线程池,可以进行线程自动回收。所谓的无界线程池就是存放线程个数是理论上的Integer.MAX_VALUE(2的31次方-1)最大值。

2、有界线程池【newFixedThreadPool(int)】:

Fixed在英语单词里有固定的意思。 方法newFixedThreadPool(int)
创建的是有界线程池。也就是说池中的线程个数可以指定最大数量。

3、单一线程池【newSingleThreadExecutor()】:

Single在单词里有单一的意思
方法newSingleThreadExecutor()方法可以创建单一线程池,单一线程池可以实现队列的方式来执行任务。

4、定时任务执行线程池【ScheduledExecutorService】

类SecheduleExecutorService的主要作用是可以将定时任务和线程池的功能结合使用。

线程池ThreadPoolExecutor:

ThreadPoolExecutor类可以非常方便地创建线程池对象,而不需要程序员设计大量的new实例化Thread相关代码。 类ThreadPoolExecutor最常用使用的构造方法是:ThreadPoolExecutor(int corePoolSize,int
maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueque workQueue)

参数介绍:

corePoolSize:池中保存所有线程数,包括空闲线程,也就是核心池的大小。
maximumPoolSize:池中允许最大的线程数。
keepAliveTime:当线程数量大于corePoolSize值时,在没有超过指定的时间内是不从线程池中将空闲线程删除,如果超过此单位,则删除。
unit:KeepAliveTime参数的时间单位
workQueue:执行当前用于保持任务的队列,此队列仅保持由execute方法提交的Runnable任务

构造方法的5种构造:

A.代表execute(runnable)与执行的数量;
B.代表corePoolSize;
C.代表maximumPoolSize;
D.代表A-B(假设A>=B);
E.代表new LinkedBlockingDeque();队列,无参构造
F.代表SynchronousQueque队列;
G.代表KeepAliveTime

构造方法中5个参数之间都有使用上的关系,在使用线程池的过程中大部分会出现如下5种过程:

1、如果A<=B,那么马上创建这个线程运行任务,并不放入扩展队列Queue中,并其他参数功能忽略,
2、如果A>B&&A<=C&&E,则C和G参数忽略,并把D放入E中等待被执行;
3、如果A>B&&A<=C&&F,则C和G参数有效,并且马上创建线程中运行着写任务,而不把D放入F中,D执行完任务后在指定时间后发生超时时将D进行清除;
4、如果A>B&&A>C&&E,则C和G参数忽略,并把D放入E中等待被执行;
5、如果A>B&&A>C&&F,则处理C的任务,其他任务则不再处理抛出异常。

BlockingQueue只是一个接口,常用的实现类有LinkedLockingQueue和ArrayBlocking-Queue.使用LinkedBlockingQueue的好处在于没有大小限制,优点是队列容量过大,所有执行execute()方法不会抛出异常,而线程池中运行的线程数永远不会超过corePoolSize值,因为其他多余的线程放入了LinkedBlockingQueue队列中,KeepAliveTime参数也就没有意义了。

ThreadPoolExecutor的四种拒绝策略:

线程池中的资源全部被占用的时候,对新添加的线程Task任务有不同的处理策略,在默认的情况下,ThreadPoolExecutor类种有4种不同的处理方式:

1、AbortPolicy:当任务添加到线程池中被拒绝时,他讲抛出RejectedExecutionExcetion异常;
2、CallerRunsPolicy:当任务添加到县城中被拒绝时,线程池会调用Thread对象处理被拒绝的任务。
3、DiscardOldestPolicy:当任务添将被拒绝时,线程池会将放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加任务中等待队列被执行;
4、DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值