Java线程池的使用

线程池,指的是管理一组”同构工作线程的资源池”.

提供相似的资源,或者是用户定制的配置,预先准备槽位等待任务的到来.

首先区别一下,”在线程池中执行任务”和”为每一个任务分配一个线程”.

  1. 前者的重点是”重用”,后者的重点是任务的”独立”,每次都在创建新的线程.
  2. 前者在处理多个请求时比后者消耗的资源要少得多,后者需要大量重复的建立销毁线程的工作
  3. 前者在任务到达时,往往线程已经存在,只需要简单的分配,后者需要即时的创建,响应速度较慢
  4. 使用线程池,更可以通过对资源的计算规划最大程度的利用CPU,Mem,文件句柄等等资源,保证系统的高效运行

一般使用Execteor框架中Executors的静态工厂方法来创建线程池

  • newFixedThreadPool

创建一个固定大小的线程池,当然不会一开始就创建好最大数量的线程,而是等待任务到来的同时创建,当任务总量大于线程池大小时,在任务队列中等待,否则,线程池中有空闲线程,此时会将空闲线程回收

  • newCachedThreadExecutor

创建一个可变大小的线程池,其他方面与Fixed类似,当线程数量超过当前线程池大小时,线程池会跟随任务量膨胀,理论上没有等待队列,当然此方法受限于系统的资源总量和网络因素,容易在大量请求并发时发生OOM

  • newSingleThreadExecutor

创建一个只有一个线程的线程池,在特殊条件下,需要对任务的执行进行排序时用到,如FIFO,Priority

当然,内部机制为了防止过度等待和超时以及线程饥饿死锁,会在队列上加入一定的等待和阻塞限制