首页 > 编程语言 > 详细

java线程池

时间:2019-10-24 01:11:30      阅读:79      评论:0      收藏:0      [点我收藏+]

需要回答的几个问题?

1. 为什么需要线程池?

2. 线程池类图、线程池的核心参数、线程池相关依赖类?

3. 线程池怎么使用?

4. 使用线程池需要注意什么?

5. 线程池的实际使用源码分析

6. 模拟服务器应用线程池

一、为什么要使用线程池

线程池是用来管理一组线程,并且可以提供管理线程一些额外功能。每当有一个新的任务则使用线程池,让线程池进行去处理这个任务,可以提高应用的吞吐量。

1. 这样就可以避免来一个任务然后进行创建一个线程T1、然后再关闭一个线程T3,因为T1 + T3的时间可能大于T2的执行时间,这样带来额外的时间效率很低。

2. 如果5000个请求,都开辟线程,线程是需要具有独立空间的,很可能直接oom,使用线程池就可以避免高并发。

 

二、线程池类图的架构

executor提供了execute()方法,也就是执行,把任务的提交和软件的执行给分离。

executorServer就相当于一个线程池服务,提供了管理线程池的生命周期以及更加方便的任务提交。

ThreadPoolExector是 用于管理java的多线程,包括线程的空闲处理机制以及拒绝机制也就是一个可以通过传入的参数配置创建一个自定义具体的功能的线程池。

技术分享图片

 

 1.1 ThreadPoolExector线程池的相关参数

技术分享图片

 

 

new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler)
     corePoolSize:      线程池维护线程的最少数量 (core : 核心) 默认
     maximumPoolSize:   线程池维护线程的最大数量 
     keepAliveTime:     线程池维护线程所允许的空闲时间 代表空余的线程存活的时间,当多余的线程(当前线程 减去 核心线程 = 多余线程)完成任务的时候,需要多长时间进行回收
     unit:               线程池维护线程所允许的空闲时间的单位
     workQueue:          线程池所使用的缓冲队列,用来放置需要处理的任务,该任务可以实现Runnable或者callable
     handler:            线程池对拒绝任务的处理策略  RejectedExecutionHandler  默认使用 new AbortPolicy();

 

技术分享图片

 workQueue是一个堵塞式队列,线程池可以使用take和put进行取任务和放任务,之所以线程是可以进行循环使用是因为核心线程一直在循环向work执行take操作,多余线程使用take(keepalive)也一直获取任务,如果在一定时间没有获得任务则进行清楚。

 

RejectedExecutionHandler提供了四种方式来处理任务拒绝策略

1、直接丢弃(DiscardPolicy)

2、丢弃队列中最老的任务(DiscardOldestPolicy)。

3、抛异常(AbortPolicy)

4、将任务分给调用线程来执行(CallerRunsPolicy)。

 三、线程池的处理流程

ThreadPoolExecutor执行execute方法分下面4种情况:

1、如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(执行这一步骤需要获取全局锁)。
2、如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。
3、如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(执行这一步骤需要获取全局锁)
4、如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用
RejectedExecutionHandler.rejectedExecution()方法。

技术分享图片

 

 

技术分享图片

五、Exectors 执行器工具类

Exectors  提供已经封装好的几个可以使用于特定场景的几个线程池

fiexdThreadPool()\cacheThreadPool\signalThreadPool\SchduledThreadPool

https://my.oschina.net/sdlvzg/blog/2222136   使用方式。

 

 

分类:

1.        创建无大小限制的线程池(newCachedThreadPool())

2.        创建固定大小的线程池(newFixedThreadPool(int nThreads))

3.        单线程池 (newSingleThreadScheduledExecutor())

4.  创建定时调度池 (newScheduledThreadPool(int corePoolSize)

前面三个使用linkedBlockingQueue,后面一个使用是DelayBlockingQueue

五、线程池的实际使用

 

java线程池

原文:https://www.cnblogs.com/fc520/p/11729467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!