线程池的工做原理
一个线程池管理了一组工做线程, 同时它还包括了一个用于放置等待执行算法
任务的任务队列(阻塞队列) 。多线程
一个线程池管理了一组工做线程, 同时它还包括了一个用于放置等待执行并发
任务的任务队列(阻塞队列) 。性能
默认状况下, 在建立了线程池后, 线程池中的线程数为 0。 当任务提交给学习
线程池以后的处理策略以下:线程
1 若是此时线程池中的数量小于 corePoolSize(核心池的大小) , 即便线程池中的线程都处于空闲状态, 也要建立新的线程来处理被添加的任务(也就是每来一个任务, 就要建立一个线程来执行任务) 。
2 若是此时线程池中的数量大于等于 corePoolSize, 可是缓冲队列workQueue 未满, 那么任务被放入缓冲队列, 则该任务会等待空闲线程将其取出去执行。
3 若是此时线程池中的数量大于等于 corePoolSize , 缓 冲 队 列workQueue 满, 而且线程池中的数量小于 maximumPoolSize(线程池最大线程数) , 建新的线程来处理被添加的任务。
4 若是 此时 线程 池中 的数量 大 于 等 于 corePoolSize, 缓 冲 队列workQueue 满, 而且线程池中的数量等于 maximumPoolSize, 那么经过RejectedExecutionHandler 所指定的策略(任务拒绝策略)来处理此任务。也就是处理任务的优先级为: 核心线程 corePoolSize、 任务队列workQueue、 最大线程 maximumPoolSize, 若是三者都满了, 使用handler 处理被拒绝的任务。队列
使用线程池的好处内存
虽然线程池是构建多线程应用程序的强大机制, 但使用它并非没有风险的。资源
(1) 线程池的大小。 多线程应用并不是线程越多越好, 须要根据系统运行的软硬件环境以及应用自己的特色决定线程池的大小。 通常来讲, 若是代码结构合理的话, 线程数目与 CPU数量相适合便可。 若是线程运行时可能出现阻塞现象, 可相应增长池的大小; 若有必要可采用自适应算法来动态调整线程池的大小, 以提升 CPU 的有效利用率和系统的总体性能。io
(2) 并发错误。 多线程应用要特别注意并发错误, 要从逻辑上保证程序的正确性, 注意避免死锁现象的发生。
(3) 线程泄漏。 这是线程池应用中一个严重的问题, 当任务执行完毕而线程没能返回池中就会发生线程泄漏现象。
学习交流群:669823128