线程池简介
1.简介
线程池模型由n个任务及为了让这些任务并发执行的m个线程组成,通常情况下
m≠n
,线程的数量取
决于需要并行的任务数以及计算资源等,而任务的数量取决于具体情况,这是不可以预知的。
2.使用线程池
为什么使用线程池,而不是仅仅简单地显式为每个任务分配一个线程呢?使用线程池的可以防止在创建线程的过程中时间和内存上的固有开销,以避免资源耗尽,例如打开文件或者建立网络连接。
那么如何为线程分发任务呢(或者说线程池如何进行任务调度)?
一般情况是通过任务队列(需要一些技术来同步)实现的。线程池中的线程从队列中“拿走”任务并执行,执行完成后回到线程池中等待下一个任务。简单示意图如下:
实际上类似于一个生产者消费者模型(也可以参考 Java多线程BlockingQueue的实现):
生产者:
加锁
条件等待缓冲区满的情况
放入
解锁
通知消费者(如果消费者远远多于生产者)
消费者:
加锁
条件等待缓冲区为空的情况
取出
解锁
通知生产者(如果生产者远远多于消费者)
以上内容翻译自维基百科:Thread Pool
合理利用线程池能够带来三个好处。
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。
线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。
3.线程池实现
Java中提供ThreadPoolExecutor
类,详情可参考:Java并发编程:线程池使用
关于线程池的实现,参考C++封装线程池