线程池的工作原理
、
一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行
任务的任务队列(阻塞队列) 。
一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行
任务的任务队列(阻塞队列) 。
默认情况下, 在创建了线程池后, 线程池中的线程数为 0。 当任务提交给
线程池之后的处理策略如下:
如果此时线程池中的数量小于 corePoolSize(核心池的大小) , 即使线程池中的线程都处于空闲状态, 也要创建新的线程来处理被添加的任务(也就是每来一个任务, 就要创建一个线程来执行任务) 。
如果此时线程池中的数量大于等于 corePoolSize, 但是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。
如 果 此 时 线 程 池 中 的 数 量 大 于 等 于 corePoolSize , 缓 冲 队 列workQueue 满, 并且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。
如果 此时 线程 池中 的数量 大 于 等 于 corePoolSize, 缓 冲 队列workQueue 满, 并且线程池中的数量等于 maximumPoolSize, 那么通过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 如果三者都满了, 使用handler 处理被拒绝的任务。
5. 特别注意, 在 corePoolSize 和 maximumPoolSize 之间的线程数会被自动释放。 当线程池中线程数量大于 corePoolSize 时, 如果某线程空闲时间超过 keepAliveTime, 线程将被终止, 直至线程池中的线程数目不大于 corePoolSize。 这样, 线程池可以动态的调整池中的线程数。
使用线程池的好处
- 1.通过重复利用已创建的线程, 减少在创建和销毁线程上所花的时间以及系统资源的开销。
- 2.提高响应速度。 当任务到达时, 任务可以不需要等到线程创建就可以立即行。
- 3.提高线程的可管理性。 使用线程池可以对线程进行统一的分配和监控。
- 4.如果不使用线程池, 有可能造成系统创建大量线程而导致消耗完系统内存。
线程池的注意事项
虽然线程池是构建多线程应用程序的强大机制, 但使用它并不是没有风险的。
(1) 线程池的大小。 多线程应用并非线程越多越好, 需要根据系统运行的软硬件环境以及应用本身的特点决定线程池的大小。 一般来说, 如果代码结构合理的话, 线程数目与 CPU数量相适合即可。 如果线程运行时可能出现阻塞现象, 可相应增加池的大小; 如有必要可采用自适应算法来动态调整线程池的大小, 以提高 CPU 的有效利用率和系统的整体性能。
(2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。
(3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。