黑马程序员技术交流社区
标题: 【黑马程序员济南】一起聊聊线程池吧(1) [打印本页]
作者: 大山哥哥 时间: 2017-10-31 12:33
标题: 【黑马程序员济南】一起聊聊线程池吧(1)
hello,接下来的一段时间里,我来和大家一起来聊聊线程池把~首先咱们先来入个门,给大家先介绍一下相关的基本概念.在后面的讨论中则会带大家深入的去探讨下~
ThreadPoolExecutor
ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler)
参数信息:
1) corePoolSize: 核心线程数,能够同时执行的任务数量
2) maximumPoolSize:除去缓冲队列中等待的任务,最大能容纳的任务数(其实是包括了核心线程池数量)
3) keepAliveTime:超出workQueue的等待任务的存活时间,就是指maximumPoolSize里面的等待任务的存活时间
4) unit:时间单位
5) workQueue:阻塞等待线程的队列,一般使用new LinkedBlockingQueue<Runnable>()这个,如果不指定容量,
会一直往里边添加,没有限制,workQueue永远不会满,一般选择没有容量上限的队列;
6) threadFactory:创建线程的工厂,使用系统默认的类
7) handler:当任务数超过maximumPoolSize时,对任务的处理策略,默认策略是拒绝添加
执行流程:
当线程数小于corePoolSize时,每添加一个任务,则立即开启线程执行,当corePoolSize满的时候,后面添加的任务将放入缓冲队列workQueue等待;
当workQueue也满的时候,看是否超过maximumPoolSize线程数,如果超过,默认拒绝执行,如果没有超过,则创建线程立即执行。
举例说明:
假如:corePoolSize=2,maximumPoolSize=3,workQueue容量为8;
最开始,执行的任务A,B,此时corePoolSize已用完,再次执行任务C,则C将被放入缓冲队列workQueue中等待着,如果后来又添加了7个任务,此时workQueue已满,则后面再来的任务将会和maximumPoolSize比较,由于maximumPoolSize为3,因为有2个在corePoolSize中运行了,所以只能容纳1个了,那么会立即创建线程执行。那么后面来的任务默认都会被拒绝--通常都会报异常。
系统提供的线程池
通过Executors提供的静态方法,咱们可以创建出来下面四种线程池:
1.newCachedThreadPool 是一个可根据需要创建新线程的线程池
2.newSingleThreadExecutor 创建是一个单线程池,线程池中只有一个线程
3.newFixedThreadPool 创建固定大小的线程池
4.newScheduledThreadPool 创建一个大小无限的线程池
ok.大体就是这些了~,下次则和大家讨论下线程池中execute(Runnable r)和sumbit(Runnable r)方法的区别~
作者: jingxian90 时间: 2017-10-31 14:16
线程池感觉好深奥啊, 我感觉好多东西都会用到线程池,比如 Servlet连接 数据库连接,最基本的TCP协议的 Socket连接 都会用到线程池
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |