网络访问频繁的项目---ThreadManager(线程池管理类)

thread-pool-manager:用Java实现的简单线程池管理器 线程池管理器 用Java实现的简单线程池管理器 立即下载

一、先了解ThreadPoolExecutor这个类。

线程池ThreadPoolExecutor继承自ExecutorService.是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行。
构造函数
  
ThreadPoolExecutor(int corePoolSize, 
                              int maximumPoolSize, 
                              long keepAliveTime, 
                              TimeUnit unit, 
                              BlockingQueue<Runnable> workQueue, 
                              ThreadFactory threadFactory, 
                              RejectedExecutionHandler handler)

   (一)了解一个常用变量

                corePoolSize:线程池维护线程的最少数量.
                maximumPoolSize:线程池维护线程的最大数量
                keepAliveTime :线程池维护线程所允许的空闲时间
                unit:线程池维护线程所允许的空闲时间的单位
                workQueue: 线程池所使用的缓冲队列
                handler: 线程池对拒绝任务的处理策略
      一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是Runnable类型对象的run()方法。
      当一个任务通过execute(Runnable)方法欲添加到线程池时:

      l  如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

      l  如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

      l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

      l  如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

     l  当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。


ThreadPoolExecutor配置

一、ThreadPoolExcutor为一些Executor提供了基本的实现,这些Executor是由Executors中的工厂 newCahceThreadPool、newFixedThreadPool和newScheduledThreadExecutor返回的。 ThreadPoolExecutor是一个灵活的健壮的池实现,允许各种各样的用户定制。

二、线程的创建与销毁

1、核心池大小、最大池大小和存活时间共同管理着线程的创建与销毁。

2、核心池的大小是目标的大小;线程池的实现试图维护池的大小;即使没有任务执行,池的大小也等于核心池的大小,并直到工作队列充满前,池都不会创建更多的线程。如果当前池的大小超过了核心池的大小,线程池就会终止它。

3、最大池的大小是可同时活动的线程数的上限。

4、如果一个线程已经闲置的时间超过了存活时间,它将成为一个被回收的候选者。

5、newFixedThreadPool工厂为请求的池设置了核心池的大小和最大池的大小,而且池永远不会超时

6、newCacheThreadPool工厂将最大池的大小设置为Integer.MAX_VALUE,核心池的大小设置为0,超时设置为一分钟。这样创建了无限扩大的线程池,会在需求量减少的情况下减少线程数量。

三、管理

1、 ThreadPoolExecutor允许你提供一个BlockingQueue来持有等待执行的任务。任务排队有3种基本方法:无限队列、有限队列和同步移交。

2、 newFixedThreadPool和newSingleThreadExectuor默认使用的是一个无限的 LinkedBlockingQueue。如果所有的工作者线程都处于忙碌状态,任务会在队列中等候。如果任务持续快速到达,超过了它们被执行的速度,队列也会无限制地增加。稳妥的策略是使用有限队列,比如ArrayBlockingQueue或有限的LinkedBlockingQueue以及 PriorityBlockingQueue。

3、对于庞大或无限的池,可以使用SynchronousQueue,完全绕开队列,直接将任务由生产者交给工作者线程

4、可以使用PriorityBlockingQueue通过优先级安排任务


项目中一个线程池管理类,提供三个线程池

public class ThreadManager {
    public static final String DEFAULT_SINGLE_POOL_NAME = "DEFAULT_SINGLE_POOL_NAME";

    private static ThreadPoolProxy mLongPool = null;
    private static Object mLongLock = new Object();

    private static ThreadPoolProxy mShortPool = null;
    private static Object mShortLock = new Object();

    private static ThreadPoolProxy mDownloadPool = null;
    private static Object mDownloadLock = new Object();

    private static Map<String, ThreadPoolProxy> mMap = new HashMap<String, ThreadPoolProxy>();
    private static Object mSingleLock = new Object();

    // private static ThreadPoolProxy

    /** 获取下载线程 */
    public static ThreadPoolProxy getDownloadPool() {
        synchronized (mDownloadLock) {
            if (mDownloadPool == null) {
                mDownloadPool = new ThreadPoolProxy(3, 3, 5L);
            }
            return mDownloadPool;
        }
    }

    /**
     * 获取一个用于执行长耗时任务的线程池,避免和短耗时任务处在同一个队列 而阻塞了重要的短耗时的任务,通常用联网操作s
     */
    public static ThreadPoolProxy getLongPool() {
        synchronized (mLongLock) {
            if (mLongPool == null) {
                mLongPool = new ThreadPoolProxy(5, 5, 5L);
            }
            return mLongPool;
        }
    }

    /** 获取一个用于执行短耗时任务的线程池,避免因为和耗时长的任务处在同一个队列而长时间得不到执行,通常用来执行本地的IO/SQL */
    public static ThreadPoolProxy getShortPool() {
        synchronized (mShortLock) {
            if (mShortPool == null) {
                mShortPool = new ThreadPoolProxy(2, 2, 5L);
            }
            return mShortPool;
        }
    }

    /** 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题 */
    public static ThreadPoolProxy getSinglePool() {
        return getSinglePool(DEFAULT_SINGLE_POOL_NAME);
    }

    /** 获取一个单线程池,所有任务将会被按照加入的顺序执行,免除了同步开销的问题 */
    public static ThreadPoolProxy getSinglePool(String name) {
        synchronized (mSingleLock) {
            ThreadPoolProxy singlePool = mMap.get(name);
            if (singlePool == null) {
                singlePool = new ThreadPoolProxy(1, 1, 5L);
                mMap.put(name, singlePool);
            }
            return singlePool;
        }
    }

    public static class ThreadPoolProxy {
        private ThreadPoolExecutor mPool;
        private int mCorePoolSize; //线程池维护线程的最少数量
        private int mMaximumPoolSize; //线程池维护线程的最大数量
        private long mKeepAliveTime; //线程池维护线程所允许的空闲时间

        private ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
            mCorePoolSize = corePoolSize;
            maximumPoolSize = maximumPoolSize;
            mKeepAliveTime = keepAliveTime;
        }

        // 执行任务,当线程池处于关闭,将会重新创建的线程池
        public synchronized void execute(Runnable runn) {
            if (runn == null) {
                return;
            }
            if (mPool == null || mPool.isShutdown()) {
                // 参数说明
                // 当线程池中的线程小于mCorePoolSize,直接创建新的线程加入线程池执行任务
                // 当线程池中的线程数目等于mCorePoolSize,将会把任务放入任务队列BlockingQueue中
                // 当BlockingQueue中的任务放满了,将会创建新的线程去执行,
                // 但是当总线程数大于mMaximumPoolSize时,将会抛出异常,交给RejectedExecutionHandler处理
                // mKeepAliveTime是线程执行完任务后,且队列中没有可以执行的任务,存活的时间,后面的参数是时间单位
                // ThreadFactory是每次创建新的线程工厂
                mPool = new ThreadPoolExecutor(mCorePoolSize,//
                        mMaximumPoolSize, mKeepAliveTime,//
                        TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
                        Executors.defaultThreadFactory(), new AbortPolicy());
            }
            mPool.execute(runn);
        }

        /** 取消线程池中某个还未执行的任务 */
        public synchronized void cancel(Runnable runn) {
            if (mPool != null && (!mPool.isShutdown()) || mPool.isTerminating()) {
                mPool.getQueue().remove(runn);
            }
        }

        /** 取消线程池中某个还未执行的任务 */
        public synchronized boolean contains(Runnable runn) {
            if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
                return mPool.getQueue().contains(runn);
            } else {
                return false;
            }
        }

        /** 立刻关闭线程池,并且正在执行的任务也将会被中断 */
        public void stop() {
            if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
                mPool.shutdown();
            }
        }

        /** 平缓关闭单任务线程池,但是会确保所有已经加入的任务都将会被执行完毕才关闭 */
        public synchronized void shutdown() {
            if (mPool != null && (!mPool.isShutdown() || mPool.isTerminating())) {
                mPool.shutdownNow();
            }
        }
    }
}



ThreadPoolManager_线程池管理 java做的线程池管理,比较实用,eclipse工程,导入即可运行。 立即下载

相关推荐

时间卷积网络(TCN):结构+pytorch代码

文章目录TCNTCN结构1-D FCN的结构因果卷积(Causal Convolutions)膨胀因果卷积(Dilated Causal Convolutions)膨胀非因果卷积(Dilated Non-Causal Convolutions)残差块结构pytorch代码讲解 TCN   TCN(Temporal Convolutional Network)是由Shaojie Bai et al....

Leon_winter的博客 11万+

线程池管理类ThreadPoolManager

package com.tools; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 线程池管理(线程统一调度管理) */ public final cla...

xiaochongwu的专栏 3633

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6294

thread_pool_manager,线程池生命周期管理。

ThreadPoolManager 现在我们很多时候都会用到线程池,有时候我们在一个项目会用到多个或者多种线程池,对线程池管理也是非常重要的。

qq_18478183的博客 1303

STM32F407 HAL库 LIN DMA 配置实战与汽车电子应用解析

本文详细解析了STM32F407 HAL库在LIN总线通信中的DMA配置实战,重点介绍了硬件自动处理断点检测、同步场和校验和的优势。通过具体代码示例和汽车电子应用案例(如车窗控制、座椅调节),阐述了如何利用DMA提升通信效率与稳定性,为成本敏感的汽车电子系统提供高效解决方案。

study的专栏 968

ESP32-P4开发板实战:从零配置VSCode环境到点亮MIPI-DSI屏幕(避坑指南)

本文详细介绍了ESP32-P4开发板在VSCode环境下的配置流程,包括SDK安装、idf_component.yml依赖管理,以及MIPI-DSI屏幕驱动的实现方法。通过实战指南帮助开发者避开常见配置陷阱,快速完成从环境搭建到屏幕点亮的全流程,适用于物联网和嵌入式开发场景。

pp12345的博客 743

【Java 多线程 3】线程池2

一、线程池简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅...

学Java,找哪吒 3434

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 192

ThreadPoolManager

public void checkIPAuth(String iccid,String ipAddress) { AsyncIPAuth as = new AsyncIPAuth(iccid,ipAddress); boolean isSucceed = false; ThreadPoolManager poolManager = ThreadPoolManager.getInstan

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的 2162

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

智能小车避障功能的实现(cpp,ubuntu)

智能小车避障功能的实现(cpp,ubuntu)

weixin_62135607的博客 4376

Android中的线程池

线程池的优点 1、重用线程池中的线程,避免创建和销毁带来的性能开销; 2、能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致阻塞现象; 3、能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。 定义 我们在《Android中线程形态AsyncTask、HandlerThread和IntentService工作原理分析》中介绍AsyncTask的工作原...

子云心的博客 828

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 701

Java ThreadManager(线程池管理类)-网络频繁访问处理机制

http://www.aichengxu.com/view/32152

caobaokang的专栏 2153

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

PyQt多线程编程:QThread原理与实战应用

多线程编程是现代GUI开发中的核心技术,通过将耗时任务分配到工作线程,可有效解决界面卡顿问题。Qt框架提供的QThread类采用独特的事件循环机制,配合线程安全的信号槽系统,实现了高效的跨线程通信。在PyQt开发中,正确处理线程生命周期、资源竞争和界面更新是关键挑战。典型应用场景包括文件处理、网络请求和数据分析等耗时操作。通过继承QThread、移动对象到线程或使用线程池等模式,开发者可以构建响应迅速的应用程序。最新PyQt6版本对nogil模式的支持,进一步提升了多线程程序的并行计算能力。

weixin_34310369的博客 354

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

猫抓Cat-Catch技术解析:现代浏览器资源嗅探的架构演进与实践方案

在当今动态网页技术日益复杂的背景下,浏览器资源嗅探工具面临着前所未有的技术挑战。猫抓Cat-Catch作为一款开源浏览器扩展,通过创新的架构设计和高效的资源捕获机制,为开发者提供了解决现代网页动态内容捕获难题的专业方案。本文将从技术挑战、架构设计、性能优化和实际应用四个维度,深入解析这一工具的核心技术实现。 ## 🔧 现代网页资源捕获面临的技术挑战 现代网页技术已经从简单的静态资源加载演变为

gitblog_02493的博客 444

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

线程池的那些事

        一般我们进行线程的操作时,往往要创建一个新的线程,执行完毕后再销毁,等到有新的执行命令时,又得重新创建线程,如此一来显得十分繁琐,如果我们将之前执行过的线程不销毁而是放入一个池子中,当需要执行时直接引用它,这就能省下许多操作的步骤与时间,因此不会由于等待创建线程而延迟任务的执行,从而提高了响应性,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存而失败,提高线程的可管理性。 ...

现代魔法 223

对于线程池的理解

文章目录什么叫做线程池,它的作用,它的组成,为什么会有这个概念?引发思考线程池线程池的目的什么是线程池:线程池的好处:线程池的组成:如何创建一个线程池?handler的拒绝策略:线程池的种类四种常见的线程池:线程池的基本实现:线程池接口类 ThreadPool线程池实现类ThreadPoolManager.java自定义任务类Task.java线程池测试类核心方法讲解AbstractExecuto...

weixin_43874447的博客 1616

线程池介绍与示例

对于线程任务比较轻量,线程请求又比较多的情况,频繁的创建和销毁线程是非常消耗资源且低效的。这时候,就轮到线程池技术大显身手了。 线程池技术可以提高资源的利用率,即使面对突发性的大量请求,也不会产生大量线程,造成服务器崩溃。 一般一个简单线程池至少包含下列组成部分: 线程池管理器(ThreadPoolManager):用于创建并管理线程池。工作线程(WorkThread): 线程池

王浩然的博客 388

多线程——Java线程池原理深入

上次我们简单了解了一下什么是线程池以及Java中几种类型的线程池,今天我们来深入剖析一下线程池的原理。 1、构造       1. 线程池管理器(ThreadPoolManager):用于创建并管理线程池 ············· 通过这次学习,我们不仅知道了线程池是如何管理线程,而且还了解了线程多种状态之间的转换,这样更加便于我们对线程池的理解。之后,我们还将继续学习关

追梦 3344

java threadpoolmanager_理解Java线程池ThreadPoolExecutor

在Java的线程池的使用会有比较多的地方,有比较多的应用场景,介绍一下Java线程池ThreadPoolExecutor。线程是一个操作系统概念。操作系统负责这个线程的创建、挂起、运行、阻塞和终结操作。而操作系统创建线程、切换线程状态、终结线程都要进行CPU调度----这是一个耗费时间和系统资源的事情。大多数实际场景中是这样的:处理某一次请求的时间是非常短暂的,但是请求数量是巨大的。这种背景下,如...

weixin_39640395的博客 537

【多线程】线程池总结带你详细了解线程池

② 使用 Executors.newCachedThreadPool()创建出的线程池对象的特点是线程池数目能够动态适应,随着往线程池里添加任务,这个线程池里的线程数量会根据需要自动被创建,创建之后也不会着急销毁,会在线程池里存在一段时间以备随时使用。handler:线程池的拒绝策略,一个线程池能够容纳的任务数量有上限,当持续向线程池中添加任务,一旦达到上限,不同的拒绝策略有不同的效果。corePoolSize:核心线程数------>我们如果把线程池理解成一个公司,核心线程数就相当于正式员工数量。

qq_58032742的博客 222

记录线程池的两种实现方式

记录线程池的两种实现方式一、springboot默认的线程池@Async第一步 创建AsyncConfig配置类第二步 在需要异步执行的方法上加上@Async注解二、使用ThreadPoolExecutor第一步 创建ThreadPoolManager类配置单例模式线程池第二步 使用线程池 一、springboot默认的线程池@Async 个人认为,比较适合进行简单的异步调用,很方便。 第一步 创建AsyncConfig配置类 代码片. import org.springframework.context.

weixin_40035328的博客 232

Java 线程池技术之一 自实现线程池

尽管自jdk1.5,Java已经自带了线程池实现,了解如何自己实现Java线程池有助于加深对操作系统和Java虚拟机的理解。 一,线程池的基本要素 线程池一般需要一个线程管理类: ThreadPoolManager,其作用有:   1)提供创建一定数量的线程

IterZebra 1万+

线程池的状态、submit()和execute()方法的区别

一、线程池的结构 1、线程池管理器(ThreadPoolManager):用于创建并管理线程池 2、工作线程(WorkThread): 线程池中线程 3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。 4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。 二、线程池的5种状态 Running、ShutDown、Stop、Tidying、Terminated。 线程池各个状态切换框架图: RUNNING:线程池的初始化状态,接受新的任务,处理等待队列中的任务。线程池被一旦被创

weixin_43946462的博客 723
上一篇: Android源码分析--启动时序图
下一篇: 项目实战(应用市场)----FragmentFactory
linuxMinx
博客等级 码龄15年 195粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值