线程池原理

七个核心参数的含义

参数说明
corePoolSize核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
maximumPoolSize线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程;
keepAliveTime表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
unit参数keepAliveTime的时间单位
workQueue

个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择:

ArrayBlockingQueue:一个基于数组结构的有界阻塞队列。
LinkedBlockingQueue:一个基于链表的阻塞队列,吞吐量要高于ArrayBlockingQueue。
SynchronousQueue:一个不存储元素的阻塞队列。每次插入操作必须等到另外一个线程调用移除操作,否则一直处于阻塞状态。吞吐量要高于LinkedBlockingQueue。
PriorityBlockingQueue:一个具有优先级的无线阻塞队列。
ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。
 

threadFactory线程工厂,主要用来创建线程;
handler

当队列和线程池都满了,将会执行下面的策略,jdk1.5中提供有以下四种策略:

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
————————————————
版权声明:本文为CSDN博主「欧阳思海」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sihai12345/article/details/82870009

 

ThreadPoolExecutor执行execute方法有4种情况:
1)如果当前运行的线程少于corePoolSize,则创建新的线程来执行任务。
2)如果运行的线程等于或者多余corePoolSize,则将任务加入BlockingQueue中,在等待队列中,等待有新的线程可以运行。
3)如果BlockingQueue队列满了,且没有超过maxPoolSize,则创建新的线程来处理任务。
4)如果创建的线程超过maxPoolSize,任务会拒绝,并调用RejectExecutionHandler.rejectedExecution()方法。

向线程池提交任务

1)execute()方法

execute方法用于提交不需要返回值的任务,所以也就意味着无法判断是否执行成功。

2)submit方法

submit方法可以用于提交需要有返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判读是否执行成功,并且还可以通过get()方法来获取返回值。

关闭线程池

shutdown()方法来关闭线程池。

在关闭线程池的时候,这里有两个方法可以调用,分别是shutdownshutdownNow方法。

 

五种线程池

1、newCachedThreadPool
作用:创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。

特征: 
(1)线程池中数量没有固定,可达到最大值(Interger. MAX_VALUE) 
(2)线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟) 
(3)当线程池中,没有可用线程,会重新创建一个线程

创建方式: Executors.newCachedThreadPool();

他的工作队列是SynchronousQueue,由于SynchronousQueue是同步队列,因此会在池中寻找可用线程来执行,若有可以线程则执行,若没有可用线程则创建一个线程来执行该任务;若池中线程空闲时间超过指定大小,则该线程会被销毁。

该线程池适合执行大量小任务的场景。

2、newFixedThreadPool
作用:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。

特征: 
(1)线程池中的线程处于一定的量,可以很好的控制线程的并发量 
(2)线程可以重复被使用,在显示关闭之前,都将一直存在 
(3)超出一定量的线程被提交时候需在队列中等待

创建方式: 
(1)Executors.newFixedThreadPool(int nThreads);//nThreads为线程的数量 
(2)Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory);//nThreads为线程的数量,threadFactory创建线程的工厂方式

适用:执行长期的任务,性能好很多

3、newSingleThreadExecutor
作用:创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。

特征: 
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行,且线程的存活时间是无限的

创建方式: 
(1)Executors.newSingleThreadExecutor() ; 
(2)Executors.newSingleThreadExecutor(ThreadFactory threadFactory);// threadFactory创建线程的工厂方式

适用:一个任务一个任务执行的场景,队列中任务顺序执行的场景。

4、newScheduleThreadPool
作用: 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。创建一个固定大小的线程池,线程池内线程存活时间无限制

特征: 
(1)线程池中具有指定数量的线程,即便是空线程也将保留 
(2)可定时或者延迟执行线程活动

workQueue为:new DelayedWorkQueue() 一个按超时时间升序排序的队列

创建方式: 
(1)Executors.newScheduledThreadPool(int corePoolSize);// corePoolSize线程的个数 
(2)newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);// corePoolSize线程的个数,threadFactory创建线程的工厂

线程池任务执行流程:

当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
5、newSingleThreadScheduledExecutor
作用: 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。

特征: 
(1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行 
(2)可定时或者延迟执行线程活动

创建方式: 
(1)Executors.newSingleThreadScheduledExecutor() ; 
(2)Executors.newSingleThreadScheduledExecutor(ThreadFactory threadFactory) ;//threadFactory创建线程的工厂

原文链接:https://blog.csdn.net/weichi7549/article/details/108300621

 

 

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值