首页 > 编程知识 正文

java中线程池原理,java实现线程池的几种方式

时间:2023-05-06 08:31:19 阅读:196541 作者:2114

Java中的线程池是运行场景最多的并发框架。合理使用线程池可以带来三个好处:

减少资源消耗。通过重用现有线程,减少线程创建和销毁造成的消耗
提高响应速度。当任务到达时,可以立即执行该任务,而无需等待创建线程
提高线程可管理性。线程是稀缺资源。使用线程池进行统一分配、调优和监控,可以减少资源消耗,提高系统稳定性

线程池的实现原理
向线程池提交新任务时,线程池的处理流程如下:

1.线程池判断核心线程池中的所有线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务,否则进入下一个进程
2.线程池判断工作队列是否已满,如果工作队列未满,则将新提交的任务存储在工作队列中,否则进入下一个进程
3.线程池判断线程池中的所有线程是否都处于工作状态。如果没有,创建一个新的工作线程来执行任务,否则,将它交给饱和策略来处理任务

我们可以通过 ThreadPoolExecutor 来创建一个线程池

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);

要创建线程,您需要输入几个参数,如下所示:

CorePoolSize(线程池的基本大小)

向线程池提交任务时,线程池将创建一个线程来执行任务。即使其他空闲的基本线程可以执行新的任务,它们也会创建线程。当要执行的任务数量大于线程池的基本大小时,它们将不会被再次创建。
最大组合大小(线程池的最大数量)

线程池允许创建的最大线程数。如果队列已满,并且创建的线程数小于最大线程数,线程池将创建新线程来执行任务。值得注意的是,如果使用无界阻塞队列作为任务队列,此参数没有影响

KeepAliveTime(线程活动保持时间)

线程池的工作线程空闲后保持活动的时间。如果任务多,每个任务的执行时间短,可以增加时间,提高线程利用率

单位(线程保持活动状态的时间单位)

可选单位为天、小时、分钟、毫秒、微秒和纳秒

工作队列(任务队列)

阻塞队列以保存要执行的任务。可以选择以下阻塞队列:

有界队列

是一个基于数组结构的有界阻塞队列,它根据先进先出原则对元素进行排序

队列

一种基于链表结构的阻塞队列,根据先进先出对元素进行排序,其吞吐量通常高于数组阻塞队列

同步队列

一种不存储元素的阻塞队列,每次插入操作都必须等到另一个线程调用删除操作,否则插入操作总是处于阻塞状态,吞吐量通常高于LinkedBlockingQueue

优先级队列

具有优先级的无界阻塞队列

threadFactory

它用于设置创建线程的工厂,并且可以通过线程工厂为每个创建的线程赋予一个更有意义的名称

处理器(饱和策略)

当任务和线程池已满时,意味着线程池已饱和,必须采用一种策略来处理提交的新任务。在JDK5中,线程池框架提供了以下四种策略:

AbortPolicy:直接抛出异常,默认采用此策略
调用方策略:使用调用方的线程来运行任务
丢弃队列中的最新任务并执行当前任务
丢弃策略:不要处理它,丢弃它
您还可以根据需要实现RejectedExecutionHandler接口自定义策略

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。