线程池 线程池是怎么实现的
一、Java线程池
多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。
所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。
在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。
在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:
publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler)其中每个参数代表的意义分别为:
corePoolSize:线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中
maximumPoolSize:线程池中的线程最大数量
keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut=true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut=false,即表示默认情况下,核心线程会一直存在于线程池当中。
unit:空闲线程保持连接时间(keepAliveTime)的时间单位
workQueue:阻塞的任务队列,用来保存等待需要执行的任务。
threadFactory:线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。
handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。
在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始参数值不一样;
二、线程池的7大参数是什么
线程池的7大参数通常是指以下参数:
1.核心线程数(corePoolSize):线程池中保持的常驻线程的数量,即使线程处于空闲状态也不会被回收。
2.最大线程数(maximumPoolSize):线程池允许的最大线程数量,包括核心线程和非核心线程。
3.空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数,并且这些线程处于空闲状态时,这些空闲线程在被终止之前等待新任务的最长时间。
4.时间单位(unit):用于指定空闲线程存活时间的单位,例如毫秒(MILLISECONDS)、秒(SECONDS)等。
5.阻塞队列(workQueue):用于存放等待执行的任务的队列,当线程池中的线程全部被占用时,新任务将被放入队列等待执行。
6.线程工厂(threadFactory):用于创建线程的工厂类,可自定义线程的命名、优先级等属性。
7.拒绝策略(rejectedExecutionHandler):当线程池无法接受新任务时的处理策略,例如抛出异常、丢弃任务等。
这些参数可以根据实际需求进行配置,以便优化线程池的性能和资源利用。
三、创建线程池四种方法
创建线程池的方法有四种,分别是创建线程池、申请线程、释放线程和关闭线程池。
创建线程池是通过创建线程池实体来创建线程池,申请线程是请求从线程池中获取线程,释放线程是释放线程池中分配的线程,关闭线程池是关闭线程池实体。这四种方法是线程池管理的核心功能,能够实现对线程的申请、释放和回收等操作,从而提高程序的并发性和响应速度。