当前位置:网站首页 > 人工智能与大数据应用 > 正文

环形队列有什么应用场景(环形队列不会产生什么溢出)



Android 线程池的好处_线程池

分析:我们如何理解这幅图呢,以及我们可以简单对它们进行简单的模仿?

1.  核心线程池就像相当于我们互联网公司的核心成员。

2. 当任务来的时候,核心线程池进行消费,当任务比较多的时候,由产品经理把任务统计起来(就是任务队列),如果产品经理发现任务多的已经统计不过来,说明任务队列已经满了。

3. 在任务队列里面任务太多的时候,公司就会进行招聘一些外包人员,这时的线程就是核心线程以外的线程,并且会把它们放到一个线程池中,让这些外包也来完成产生的任务,但是这时候外包人员也不能处理产生的任务

4.就会产生一种策略,其实这些策略就是异常处理,在jdk提供了四种处理异常的策略

异常策略:

  • CallerRunsPolicy:只要线程池没关闭,就直接用调用者所在线程来运行任务
  • AbortPolicy:直接抛出 RejectedExecutionException 异常
  • DiscardPolicy:悄悄把任务放生,不做了
  • DiscardOldestPolicy:把队列里待最久的那个任务扔了,然后再调用 execute() 试试看能行不

ThreadPoolExecutor:

Android 线程池的好处_线程池_02

分析:我们可以看到jdk里面提供的四种线程池里面最后都是调用threadpoolexecutor这个类,但是这个类里面有7个参数,分别

corePoolSize:核心线程大小(及互联网公司的核心成员)

maximumPoolSize:最大线程池的大小(外包人员)

keepAliveTime:除过核心线程池外,其他线程的存活时间。(及外包人员的存活时间)

unit:创建线程的存活时间

workQueue:任务队列,在jdk里面提供四种任务队列

  • ArrayBlockingQueue:基于数组、有界,按 FIFO(先进先出)原则对元素进行排序
  • LinkedBlockingQueue:基于链表,按FIFO (先进先出) 排序元素
  • SynchronousQueue:不存储元素的阻塞队列
  • PriorityBlockingQueue:具有优先级的、无限阻塞队列

threadFactory:线程工厂,对线程进行管理

策略模式:出现异常时,使用的策略。

1. newFixedThreadPool:

Android 线程池的好处_Android 线程池的好处_03

分析:keepAliveTime为0,说明只有核心线程池,产生的核心线程池以外的线程,它们的存活时间将变为0,那么在极端情况下,如果任务比较多的话,会很快使任务队列已满,可以用于负载比较重的服务器

2. newSingleThreadExecutor:

Android 线程池的好处_任务队列_04

分析:是上面newFixThreadPool的一个特例,里面核心线程只有一个,没有其他多余的线程, 用于串行执行任务的场景,每个任务必须按顺序执行,不需要并发执行。

3. newCachedThreadPool:

Android 线程池的好处_任务队列_05

分析:可以看出corePoolSize的大小为0,可以说全是外包,极端情况下会创建过多的线程,耗尽 CPU 和内存资源。

用于并发执行大量短期的小任务,或者是负载较轻的服务器。

4. newScheduledThreadPool:

Android 线程池的好处_工作线程_06

分析: 用于需要多个后台线程执行周期任务,同时需要限制线程数量的场景。

1. 首先一定这个线程池的行为规范有哪些

  • 执行线程的接口
  • 得到当前任务队列(这个任务队列就是池子,让生产者生产任务,让消费者任务)里面的任务数量
  • 得到当前任务队列里面已经消费的任务数量
  • 得到当前的工作线程数量

2. 定义ThreadManagePool这个类

  • 首先需要实现ThreadPool的行为规范
  • 需要定义消费者类,这个类主要是消费任务,但是必须把它和生产者结合起来,它必须只要什么时候需要消费,在这里使用一个链表,把两者结合起来,消费者必须每一次检查链表是不是空,如果是空的,就进行等待,直到链表不为空,进行消费。
  • 销毁线程,首先要检查任务队列里面的任务是否消费完毕,如果没有完毕进行等待处理,如果消费完毕,关闭每一个消费者,在关闭线程池。

Android 线程池的好处_Android 线程池的好处_07

分析:发现虽然我们初始化许多线程,但是只有一个线程在消费队列里面的任务,主要是因为使用的同一把锁,一次只能让一个线程进入进行消费,是一个串行的过程,有点像jdk里面的singleNewThreadPool这个线程池,还有问题就是我们解耦,通过链表把消费者和生成者联系起来,所以我们应该用一个工具来管理线程,这个类ThreadFactory。

ThreadFactory类代码:

运行类代码:

Android 线程池的好处_任务队列_08

到此这篇环形队列有什么应用场景(环形队列不会产生什么溢出)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • pass云服务(pass云服务的实际应用包括)2025-06-08 21:54:09
  • 重绘图标怎么用?(重绘第三方应用图标什么意思)2025-06-08 21:54:09
  • 快应用中心是什么软件可以卸载吗(快应用中心是什么可以删除吗)2025-06-08 21:54:09
  • 操作系统及应用答案(操作系统及其应用题目)2025-06-08 21:54:09
  • store应用商店下载(AppStore应用商店下载)2025-06-08 21:54:09
  • xp虚拟机需要装杀毒软件吗(winxp虚拟机安装应用软件)2025-06-08 21:54:09
  • 显示本机安装(本机已安装应用选项)2025-06-08 21:54:09
  • springboot应用服务器(spring boot服务器)2025-06-08 21:54:09
  • 单片机设计原理技术手册pdf(单片机原理及应用技术设计报告)2025-06-08 21:54:09
  • winxp虚拟机安装应用软件(windowsxp虚拟机安装教程)2025-06-08 21:54:09
  • 全屏图片