java线程池
1 线程池介绍
在执行一个异步任务或并发任务时,往往是通过直接new Thread()
方法来创建新的线程,但系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗。
针对这一情况,为了提高性能,我们就可以采用线程池。线程池在启动的时,会创建大量空闲线程,当我们向线程池提交任务的时,线程池就会启动一个线程来执行该任务。等待任务执行完毕以后,线程并不会死亡,而是再次返回到线程池中称为空闲状态。等待下一次任务的执行。
线程池优点:
- 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度: 当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性: 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
2 创建线程池
2.1 默认线程池Executors
JDK对线程池也进行了相关的实现,在开发中我们也很少去自定义线程池,而是使用JDK中自带的线程池。
Executors中提供了两种静态方法来创建线程池
//1 创建一个默认的线程池对象 线程池中默认为空,最多可以容纳int类型的最大值的线程数
ExecutorService executorService = Executors.newCachedThreadPool();
//2 创建一个固定大小的线程池对象,最多可以容纳10个线程数
ExecutorService executorService1 = Executors.newFixedThreadPool(10);//可通过参数控制最大线程数
2.2 自定义线程池ThreadPoolExecutor
new ThreadPoolExecutor()
源码以及参数详解
RejectedExecutionHandler是jdk提供的一个任务拒绝策略接口,它下面存在4个子类。
ThreadPoolExecutor.AbortPolicy: 丢弃任务并抛出RejectedExecutionException异常。是默认的策略。
ThreadPoolExecutor.DiscardPolicy: 丢弃任务,但是不抛出异常 这是不推荐的做法。
ThreadPoolExecutor.DiscardOldestPolicy: 抛弃队列中等待最久的任务 然后把当前任务加入队列中。
ThreadPoolExecutor.CallerRunsPolicy: 调用任务的run()方法绕过线程池直接执行。