Java线程池

Java线程池

​ Java线程池主要用于管理线程组和运行状态,以便JVM更好的利用CPU资源,线程池的主要作用就是县城服用、线程资源管理、控制操作系统的最大并发数,保证系统搞笑(通过线程资源复用实现)且安全(通过控制最大线程并发数实现) 地运行。

线程复用

​ 线程复用就是在循环方法中不断获取Runnable对象放入Queue中,大哥前线程在获取下一个Runnable对象之前可以是堵塞的,这样既可以有效控制正在执行的线程个数,也能保证系统中正在等待执行的其他线程有序执行,这样就简单实现了一个县城之,达到了线程复用的效果。

线程的核心组件和核心类

​ Java线程池由以下4个组件组成

​ 1.线程池管理:用于创建并管理线程池

​ 2.工作线程: 线程池中执行具体任务的线程

​ 3.任务接口: 用于定义工作线程的调度和执行策略,只有该线程实现了该接口,线程中的任务才能够被线程池调度。

​ 4.任务队列: 存放待处理的任务,新的任务将会不断被加入队列中,执行完任务将会被从队列中移除

​ Java中的线程池是通过Executor框架实现的,在该框架中用到了Executor、Executors、ExecutorService、ThreadPoolExecutor、Callable、Futrue、FutreTask这几个核心类,其中ThreadPoolExecutor是构造线程的核心方法。

工作原理

参数 说明
corePoolsize 线程池中核心线程数量
maximumPoolSize 线程池最大的线程数量
keepAliveTime 当前线程超出corePoolSize的时候,空闲线程的存活时间
unnit KeepAliveTime的时间单位
workQueue 任务队列,被提交但未被执行的任务存放的地方
threadFactory 线程工厂,用于线程创建,可使用默认的线程工厂活自定义线程工厂
handler 由于任务过多或其他原因导致线程池无法处理时的任务拒绝策略。

​ 线程刚被创建的时候,只是想系统申请一个用于执行线程队列和管理线程池的线程资源。在调用excute()添加一个任务的时候,

​ 首先会判断正在运行的线程数量少于corePoolSize,线程就会立刻创建线程并且执行该线程任务

​ 如果正在运行的线程数量大于等于corePoolSize,该任务就会放到堵塞队列里面,

​ 如果堵塞队列已经满了且正在运行的线程数量小于maxinumPoolSize的时候,线程池救护i创建非核心线程立刻执行该任务。

​ 如果堵塞对了已经满了且正在运行的线程数量大于等于maxinumPoolSize的时候,线程池会拒绝执行该线程任务并且抛出RejectExecutionException异常。

​ 在线程任务之习性完毕后,该任务讲被从线程池队列中移除,线程池将从队列中取下一个线程任务继续执行。

​ 在线程处于空闲状态超过KeepAliveTime时间的时候,正在运行的线程数量超出corePoolSize,那么该线程就会被认定为空闲线程,并且被停止。

拒绝策略

​ 若线程池中的核心线程数已经被用完且堵塞队列也满了,则此时线程池的线程资源已耗尽,线程池没有足够的线程资源执行新的任务,为了保证操作系统的安全,线程池会通过拒绝策略来处理新添加的线程任务。

AbortPolicy

​ AbortPolicy是直接抛出异常,阻止线程正常运行。

CallerRunsPolicy

​ 如果丢弃的线程任务未关闭,则执行该线程的任务

DiscardOlderPolicy

​ 移除线程队列中最早的一个线程任务,并且尝试提交任务

DiscardPolicy

​ 丢弃当前线程而不做任何处理,如果系统允许在资源不足的情况丢弃部分任务,这将是保证系统安全、稳定一种很好的方案。

你可能感兴趣的:(java,java,开发语言)