A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

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)方法的区别~



评分

参与人数 1黑马币 +1 收起 理由
jingxian90 + 1 很给力!

查看全部评分

1 个回复

倒序浏览

回帖奖励 +1

线程池感觉好深奥啊, 我感觉好多东西都会用到线程池,比如 Servlet连接  数据库连接,最基本的TCP协议的 Socket连接 都会用到线程池
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马