首页 > 编程语言 >干货-并发编程提高——线程池(十二)

干货-并发编程提高——线程池(十二)

时间:2024-08-23 09:21:51浏览次数:12  
标签:对象 创建 编程 干货 池化 集合 线程 节点

提到线程池就不得不说池化技术,那么什么是池化技术呢?

池化技术能够减少资源对象的创建次数,提高程序的性能。特别是高并发下这种提高更加明显。使用池化技术缓存的资源有如下特点:

  1. 对象的创建时间长
  2. 对象创建需要大量资源
  3. 对象创建后可被重复使用

有没有点儿像共享单车?

一个资源池需要具备如下功能:

  1. 租用资源对象
  2. 归还资源对象
  3. 清除过期资源对象

 池化的对象需要保证无状态,如果有状态需要清除状态。 并非所有对象都适合拿来池化——因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。但是对于生成时开销可观的对象,池化技术就是提高性能的有效策略了。

在Java中可以自定义或者借用第三方类库(如:apache commons-pool)实现对象池

Apache commons-pool 就是个对象池,用途还是很多的,之前一直没有注意过。没细研究过,看网友大致是先创建两个集合,一个活跃集合一个使用中集合。每次移动集合到使用中集合。并删除活跃集合中的下标。来回在两个集合中游动。我想想?我感觉有更好的方法,形成一个双向链表。使用中的集合自动汇聚。

X :使用中节点 O :未使用节点

维持头节点:Head

尾节点:Tail

最后借出节点的下一个节点 :Work

步骤:

0.初始:

O -> O -> O -> O -> O

1.借对象时直接将未使用节点置为使用状态。将第二个节点置为Work

X -> O -> O -> O -> O

2.依次借,依次挪,从Work开始往下找,如果Work节点为使用中节点,则借对象阻塞

X -> X -> X -> X -> X <- Work <- Tail

3.如果还对象的话,就把当前使用中的对象状态重置为正常的状态,并直接拼接到尾部

X -> X -> X -> X -> O <- Work <- Tail

每次做的都是迁移操作,但是因为是指针所以时间复杂度没有那么高。

借和还 时间复杂度都是O (1) ,空间复杂度也是O (1)

 

 

线程池的优点:

降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。

提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

注意线程隔离。下单的线程池与询价的线程池不要用一个,这样如果一方线程池打满出问题,便会相互影响

标签:对象,创建,编程,干货,池化,集合,线程,节点
From: https://blog.csdn.net/weixin_39384775/article/details/141435250

相关文章

  • 多线程入门Demo
    packagerun;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CompletionService;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorCompletionService;importjava.util.concurrent.Future;impo......
  • Scratch编程环境的暗色模式:探索可访问性的边界
    标题:Scratch编程环境的暗色模式:探索可访问性的边界Scratch,这个广受欢迎的图形化编程平台,由麻省理工学院媒体实验室开发,一直致力于为用户提供友好且易于访问的编程体验。随着用户对编程环境个性化需求的增长,Scratch的编程环境是否支持暗模式或可访问性选项,成为了编程教育领......
  • Scratch的诞生:开启编程世界的大门
    标题:Scratch的诞生:开启编程世界的大门Scratch,这款全球数百万儿童和青少年的编程启蒙工具,自诞生之日起就以其独特的图形化编程界面和强大的社区支持,引领着编程教育的潮流。本文将详细探讨Scratch的起源,它如何从一个教育项目成长为全球性的编程学习平台,并提供一些基础的Scrat......
  • Scratch创意工坊:启程编程与创造的无限旅程
    标题:Scratch创意工坊:启程编程与创造的无限旅程Scratch,这款由麻省理工学院媒体实验室开发的图形化编程工具,已经成为全球少儿编程教育的璀璨明星。它以独特的拖拽式编程积木,引领孩子们进入充满无限可能的编程世界。本文将详细介绍Scratch如何通过项目模板和示例代码,帮助初学......
  • Scratch编程深度探索:解锁递归与分治算法的奥秘
    标题:Scratch编程深度探索:解锁递归与分治算法的奥秘在编程的世界里,递归和分治算法以其精妙的逻辑结构和解决问题的能力而著称。Scratch,这款专为儿童和初学者设计的图形化编程工具,是否能够支持实现这样复杂的逻辑呢?本文将深入探讨Scratch在实现递归和分治算法方面的能力,并提......
  • 什么是云计算?什么是公有云?满满干货分享。
    1.1什么是云计算云计算是一种服务模式长定义是:“云计算是一种商业计算模型。它将计算机任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算能力、存储空间和信息服务”。短定义是:“云计算是通过网络按需提供可动态伸缩的廉价计算服务”这种资源地称之为......
  • 编程路上的光与影
    引言编程,这门现代世界的魔法艺术,既令人着迷又充满挑战。作为一名计算机专业的学生,在这段学习旅程中,我经历了无数次失败与挫折,但每一次跌倒后都能站起来,继续前行。今天,我想分享一些关于如何在编程的迷宫中找到光明的经验,希望能为同样走在编程之路上的你带来一丝启发。心态......
  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • [Java手撕]线程安全的转账
    首先来看线程不安全的转账publicclassBank{privateint[]accounts;publicBank(){this.accounts=newint[10];for(inti=0;i<10;i++){accounts[i]=1000;}}publicvoidtransfer(intfrom,int......
  • 系统编程-lvgl
    带界面的MP3播放器--lvgl目录带界面的MP3播放器--lvgl一、什么是lvgl?二、简单使用lvgl在工程中编写代码实现带界面的mp3播放器main.cevents_init.cevents_init.h补充1:glob函数补充2:atexit函数一、什么是lvgl?--LVGL是一个开源的嵌入式图形库,用于创建图形界......