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

环形队列有什么应用场景(环形队列不会产生什么溢出)1 nbsp 降低资源消耗 通过重复利用已创建的线程降低线程创建和销毁造成的消耗 nbsp 2 nbsp 提高响应速度 当任务到达时 任务可以不需要等到线程创建就能立即执行 nbsp 3 nbsp 提高线程的可管理性 分析 我们如何理解这幅图呢 以及我们可以简单对它们进行简单的模仿 1 nbsp nbsp 核心线程池就像相当于我们互联网公司的核心成员 2 nbsp 当任务来的时候 核心线程池进行消费 当任务比较多的时候




1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
3. 提高线程的可管理性。

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 (先进先出) 排序元素

吞吐量通常要高于 ArrayBlockingQueue
Executors.newFixedThreadPool() 使用了这个队列

  • SynchronousQueue:不存储元素的阻塞队列

每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
吞吐量通常要高于 LinkedBlockingQueue
Executors.newCachedThreadPool使用了这个队列

  • 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

编程小号
上一篇 2025-08-24 20:01
下一篇 2025-07-07 23:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/44309.html