1.线程池的出现
java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小为1M,线程过大,会消耗很多的内存。
线程池的出现,就是为了方便控制线程数量。
2.线程池原理
理解 线程池管理器、工作线程、任务接口、任务队列。
线程池管理器:用于创建并管理线程池,包括线程池的创建、销毁、添加新任务。
工作线程:线程池中的线程,在没有任务时处于等待状态。
任务接口:每个任务必须实现的接口(Runnable接口),以供工作线程调度任务的执行。
任务队列: 用于存放没有处理的任务。提供一种缓冲机制。
3.线程池线相关api
接口:Executor、ExecutorService、ScheduledExecutorService
实现类:ThreadPoolExecutor、ScheduledThreadPoolExcutor
类型 | 名称 | 描述 |
---|---|---|
接口 | Executor | 最顶层接口,定义执行任务方法execute |
接口 | ExecutorService | 继承Executor,扩展Callable、Future、shutdown关闭方法 |
接口 | ScheduledExecutorService | 继承ExcutorService,扩展定时相关方法 |
实现类 | ThreadPoolExecutor | 基础、标准的线程池实现,其他线程池都是基于此进行扩展的 |
实现类 | ScheduledThreadPoolExcutor | 继承ThreadPoolExecutor,实现了定时任务相关的方法。 |
Executors工具类,创建线程池的工具类。这些线程池都是ThreadPoolExecutor的扩展,见名知意,不详述。
4.合理设置线程数
如何设置合理的线程池中的线程数呢?
计算型任务:cpu数量的1-2倍。
IO型任务:相对比计算型任务,需要多一些线程,要根据具体的IO阻塞时常进行考虑,如tomcat默认最大线程:200。
也可以根据需要设置最小数量和最大数量,如db连接池。
上一篇:2.线程封闭之Threadlocal
下一篇:4.源码中的HashMap与JUC之ConcurrentHashMap