1、什么是
线程池:
java.util.concurrent.Executors提供了一个java.util.concurrent.Executor
接口的实现用于创建线程池
多线程技术主要解决
处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2
在线程中执行任务的时间,T3 销毁线程时间。如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
一个线程池包括以下四个基本组成部分:
a、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;
b、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以
循环的执行任务;
c、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
d、任务
队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个
例子:
假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。
2.常见线程池
①newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又
智能的添加新线程来执行。
④newScheduleThreadExecutor
大小无
限制的线程池,支持定时和周期性的执行线程
java提供的线程池更加强大,相信
理解线程池的工作原理,看类库中的线程池就不会感到陌生了。
3.java线程池实例
java.util.concurrent包提供了线程的线程池的实现。
Executor接口表示线程池,他的execute(
Runnable task)方法用来执行Runnable类型的任务。Executor
Service的字接口;
ExecutorService中声明了管理线程池的一些方法,比如用于关闭线程池的shutdown()方法等;
Executors中包含一些
静态方法,它们负责生成各种类型的线程池ExecutorService实例。