在平常开发中,一般我们会用到多线程的线程池ThreadPoolExecutor类,因为线程的创建和销毁是需要开销的,所以在执行一些特定的代码的时候会用到线程池。
Java中给我们提供了Executors工具类,提供了四种线程的方案:
- Executors.newCachedThreadPool();
- Executors.newSingleThreadExecutor();
- Executors.newScheduledThreadPool();
- Executors.newFixedThreadPool();
虽然上面的线程池是java提供的,但是并不适合我们使用:阿里巴巴java开发手册强制不能使用上面四种方式
而推荐使用的ThreadPoolExecutor才是线程池的本来面目:
通过源码学习:线程池的构造方法:
我们从源码可以看出,虽然线程池有几个构造方法,但是最终都是调用了自己7个参数的构造方法:
参数定义:
- corePoolSize //核心线程数,也可以理解无论什么时候的线程池线程数都不会少于该数
- maximumPoolSize //最大线程数,就是线程池线程数的最大值
- keepAliveTime //线程被销毁空闲时间
- unit // keepAliveTime的时间单位
- workQueue //线程最大化是的多余任务存放的队列
- threadFactory //线程工厂
- handler //当队列满时,新任务的拒绝策略
当我们足够了解线程池就可以手动实现一个线程池了,因功能需求,我实现了一个有界的单线程的单线程的线程池:
首先定义线程池所需属性
在构造方法实例化属性值
根据属性去创建线程池:
最后外部通过实例该类,即可调用该线程池对象