首页 > 其他分享 >线程池的概念和创建

线程池的概念和创建

时间:2024-07-12 19:55:07浏览次数:13  
标签:executorService Executors 创建 概念 任务 线程 执行

一,什么是线程池

线程池是在应用程序启动时创建一定数量的线程,并将它们保存在线程池中。当需要执行任务时,从线程池中获取一个空闲的线程,将任务分配给该线程执行。当任务执行完毕后,线程将返回到线程池,可以被其他任务复用。

二,线程池的运行机制

1. 当任务到达最大时,线程池管理器会检查线程池中是否有空闲的线程。如果有,则将任务分配给空闲线程执行;如果没有,则进入下一步。
2. 如果线程池中的线程数量未达到最大限制,线程池管理器会创建一个新的线程,并将任务分配给该线程执行。
3. 如果线程池中的线程数量已达到最大限制,并且工作队列未满,则将任务放入工作队列中等待执行。
4. 当线程池中的线程执行完任务后,会从工作队列中获取下一个任务并执行。

三,线程池的优点和缺点 

线程池的主要优点包括:

1,重用线程:线程池会在内部维护一组可重用的线程,避免了频繁地创建和销毁线程的开销,提高了线程的利用率。
2,控制并发度:线程池可以限制并发执行的线程数量,防止系统过载。通过调整线程池的大小,可以控制并发度,避免资源消耗过大。
3,提供线程管理和监控:线程池提供了一些管理和监控机制,例如线程池的创建、销毁、线程状态的监控等,方便开发人员进行线程的管理和调试。
4,提供任务队列:线程池通常会使用任务队列来存储待执行的任务,这样可以实现任务的缓冲和调度。

 四,如何创建线程池

java中其实提供了两种方式:

第一种: 通过工具类完成线程池的创建.[Executors]. 语法简单。但是阿里巴巴不建议使用

第二种: 通过线程池类: ThreadPoolExecutor类. 语法复杂,但是阿里巴巴建议使用。灵活 

线程的根接口: Executor. 里面只有一个方法: execute

子接口: ExecutorService。

 1.Executors

  1. 固定大小的线程池对象newFixedThreadPool

  2. 单一线程池: newSingleThreadExecutor

  3. 可变线程池: newCachedThreadPool

  4. 延迟线程池: newScheduledThreadPool

    public class Test01 {
        public static void main(String[] args) {
            //创建一个固定大小的线程池。返回类型为ExecutorService.
    //        ExecutorService executorService = Executors.newFixedThreadPool(5);
            //创建单一线程池【池子里面只有一个线程的对象】适合任务顺序执行的。
    //        ExecutorService executorService = Executors.newSingleThreadExecutor();
            //创建可变线程池。【池子中线程的数量会随着任务的大小而变化】
    //        ExecutorService executorService = Executors.newCachedThreadPool();
            //延迟线程池:[指定时间后执行]
            ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
    
            //执行线程任务。Runnable  Callable. Integer.MAX()整数的最大值。
    //        for(int i=0;i<10;i++) {
                //1.必须传递Runnable对象。[1]自己创建一个类实现Runnable接口  [2]匿名内部类对象 [3]lambda表达式: 前提接口必须为函数式接口。
    //            executorService.execute(new My());
    //            executorService.execute(new Runnable() {
    //                @Override
    //                public void run() {
    //                    System.out.println(Thread.currentThread().getName()+"*************");
    //                }
    //            });
                //表示10秒后执行任务代码块。
    //            executorService.schedule(()->{
    //                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~");
    //            },10, TimeUnit.SECONDS);
                executorService.scheduleAtFixedRate(()->{
                    System.out.println(Thread.currentThread().getName());
                },5,2,TimeUnit.SECONDS);
    //        }
    
            //关闭线程池
    
        }
    }
    2.ThreadPoolExecutor
public class Test02 {
    public static void main(String[] args) {
        //核心参数的意思
        /**
         * int corePoolSize,核心线程数的个数 2
         *  int maximumPoolSize,最大线程数量 5
         * long keepAliveTime, 非核心线程允许空闲的时间
         * TimeUnit unit, 时间的单位
         * BlockingQueue<Runnable> workQueue 堵塞队列中 3
         */
        BlockingQueue<Runnable> workQueue=new ArrayBlockingQueue(5);
        ThreadPoolExecutor poolExecutor=new ThreadPoolExecutor(2,6,10, TimeUnit.SECONDS,workQueue);

        for (int i = 0; i <11; i++) {
            poolExecutor.submit(()->{
                System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~");
            });
        }
    }
}

 总结:

Executors类中封装好的创建线程池的方法使用方便,但是也有其局限性和风险性,所以我们可以使用 ThreadPoolExecutor 类中的构造方法手动创建线程池的实例, 从而可以根据我们的使用情况来指定参数,满足使用的同时又能规避风险。

标签:executorService,Executors,创建,概念,任务,线程,执行
From: https://blog.csdn.net/2403_83201286/article/details/140344891

相关文章

  • 深度学习入门指南:从基础概念到实战项目
    今天我们来聊聊深度学习。这名字听起来可能有点吓人,但其实它并没有那么神秘。就像我们小时候学骑自行车,一开始可能会摔倒几次,但一旦掌握了平衡,你就会觉得骑车是一件很自然的事情。深度学习也是这样,只要你愿意花点时间去了解和实践,很快就能上手。什么是深度学习?我们先来拆解一......
  • 深入理解 JavaScript 闭包:前端开发中的重要概念
    闭包是JavaScript中一个非常重要的概念,对于理解和编写高效、灵活的代码至关重要。尽管它看似复杂,但一旦掌握了闭包,你将能够更好地理解JavaScript的函数作用域和变量生命周期。本文将深入探讨JavaScript闭包,帮助你在前端开发中更好地运用这一强大工具。什么是闭包?闭包是指......
  • Cilium LB IPAM概念(转载)
    CiliumLBIPAM概念一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、CiliumLBIPAM概念说明参考官方文档......
  • 使用 Vue 和 Plotly.js 创建交互式 3D 网格图
    本文由ScriptEcho平台提供技术支持项目地址:传送门使用Vue和Plotly.js创建交互式3D网格图应用场景介绍3D网格图是一种强大的可视化工具,可用于表示具有三个维度的数据。它们广泛应用于科学、工程和医学等领域,用于显示复杂数据并揭示潜在模式。代码基本功能介绍......
  • SOP干货 | 巧用SaaS软件轻松创建
    在当今这个日新月异的商业环境中,标准操作程序(SOP)作为组织内部运作的指南和保障,其重要性不言而喻。SOP通过明确界定工作流程、任务分配、质量标准以及安全措施,确保了组织在复杂多变的经营环境中能够保持高效、稳定和可预测的运行状态。随着技术的飞速发展,尤其是SaaS(软件即......
  • Git 的基本概念和使用方式
    Git是一个版本控制系统,它可以跟踪和管理代码的修改历史。下面是Git的一些基本概念和使用方式的解释:仓库(Repository):Git仓库是存储代码的地方。可以在本地计算机上创建一个本地仓库,也可以在代码托管平台(如GitHub、Bitbucket)上创建一个远程仓库。仓库可以包含代码及其历史记录。......
  • 如何使用 Unity 的 ScriptableObjects 和 Resources 系统来创建一个简易的数据库系统,
    1.引言问题:如何在Unity中存储数据?解决方案:使用ScriptableObjects和Resources系统创建一个易于使用和管理的数据库。优势:自动读写数据自动处理资源实例化和更改无需额外插件使用用户定义键进行访问可扩展性强2.实现2.1项目结构四个主要的脚本:Item......
  • 网络流-基础概念
    网络网络是一个由\(n\)个点\(m\)条边组成的有向图\(G\),满足每一条边\(x\toy\)都有边权\(C_{x\toy}\),我们称\(C_{x\toy}\)为容量。图中还有两个特别的点,分别是源点\(S\)和汇点\(T\),满足\(S\neT\)。流如果函数\(f(x\toy)\)满足以下的要求,那么我们称函数\(f......
  • “好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境
    目录主题:好易智算平台推荐+RTX4090DGPU实例租用演示+安装配置torch1.9.1+cuda11.1.1环境引言:算力的新时代平台介绍:技术与信任的结晶使用案例:实际使用展示创建实例开始使用连接实例(下文演示使用Xshell连接,后续传文件也有配套的sftp可以使用)sftp传文件查看服务器配置,使用C......
  • 在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信
    在Linux系统中,当你遇到使用touchtest.file命令创建新文件时报错提示磁盘已满,但使用df-h命令查看磁盘使用率时却显示只有60%的磁盘空间被使用,这种情况可能由以下几个原因造成:inode耗尽:在Linux文件系统中,每个文件或目录都需要一个inode(索引节点)来存储其元数据(如权限、所有者......