我的编程空间,编程开发者的网络收藏夹
学习永远不晚

线程池是什么?线程池(ThreadPoolExecutor)使用详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

线程池是什么?线程池(ThreadPoolExecutor)使用详解

点一点,了解更多https://www.csdn.net/

本篇文章将详细讲解什么是线程池,线程池的参数介绍,线程池的工作流程,使用Executors创建常见的线程池~~~

目录

点一点,了解更多

文章目录

一、线程池的概念

1.1线程池的目的-提高效率

二、线程池的参数介绍

2.1线程池的拒绝策略

以上四种策略要重点掌握,面试常考~~

三、线程池的工作流程

四、线程池的创建

4.1方法一 

 4.2方法二 

4.3方法三

4.4方法四

4.5方法五

4.6方法六

4.7方法七

五、模拟实现一个线程池


一、线程池的概念

简单来说,可以理解为一个“现成的池子”,里面有一定数量的线程等待工作,每次使用不用再次创建、使用完了不用马上销毁,会自动回收进池子中。类似常量池等等~~

虽然创建销毁线程比创建销毁进程更轻量, 但是在频繁创建销毁线程的时候还是会比较低效,线程池就是为了解决这个问题,如果某个线程不再使用了,并不是真正把线程释放,而是放到一个“池子”中,下次如果需要用到线程就直接从池子中取,不用再次创建。

1.1线程池的目的-提高效率

池的目的就是为了提高效率,从线程池中拿线程,属于用户态操作;而从系统再去创建线程,涉及到用户态和内核态之间的切换,真正的创建是在内核态完成的。

那么什么是用户态?什么是内核态?下面我来举个例子:

银行中有大厅和服务柜台,大厅相当于用户态,柜台相当于内核态;每个地方都有打印机,如果来客户需要办理业务,可以在打印机上办理,也可以找工作人员办理。

此时来个老哥,说想办个银行卡,但是没带身份证复印件,有俩个办法:1.自己去大厅的复印件,自己复印一份,拿过来。2.让工作人员去柜台里面的打印机,去复印下再拿回来。

那么如果自己去复印,就立即去了,立即回来了,中间不耽误;如果工作人员去复印,他可能会做点别的,确实能给你复印,但是就不一定及时了~~

结论:用户态操作,时间是可控的;涉及到内核态操作,时间就不可控了~~

二、线程池的参数介绍

先看ThreadPoolExecutor 的构造方法

重点理解一下这几个参数含义:先情景带入一下,把线程池当作公司,一类正式员工;一类实习生;

corePoolSize:核心线程数,相当于正式员工

maxinumPoolSize:最大线程数,相当于正式员工+实习生

long keepAliveTime:实习生线程保持存活的时间 

当任务比较少的时候,整体比较空闲,实习生不是立即被辞退的,表示实习生最大的存活时间

TimeUnit unit:单位,秒,分钟,毫秒

 

BlockingQueue workQueue:线程池里要管理很多任务,这些任务也是通过阻塞队列来组织的,此时可以手动指定一个队列给线程池,此时就可以很方便的获取队列中的信息

ThreadFactory threadFactory:工厂模式,创建线程的辅助的类

RejectedExecutionHandler handler:线程池的拒绝策略,如果任务量超出公司的负荷接下来该怎么处理

2.1线程池的拒绝策略

上述四种是标准库中提供的四种拒绝策略:

表示如果队列满了,继续添加任务, 添加操作之间抛出异常(新老都执行不了,哭)

添加的线程自己负责执行这个任务(怼回去)

丢弃最老的任务

 丢弃最新的任务 

以上四种策略要重点掌握,面试常考~~

三、线程池的工作流程图

四、线程池的创建

  • ExecutorService 表示一个线程池实例
  • Executors 是一个工厂类, 能够创建出几种不同风格的线程池
  • ExecutorService 的 submit 方法能够向线程池中提交若干个任务
  • Executors 本质上是 ThreadPoolExecutor 类的封装

4.1方法一 

创建具有十个线程的线程池(大小固定)

public class ThreadDemo {    public static void main(String[] args) {        ExecutorService pool = Executors.newFixedThreadPool(10);        pool.submit(new Runnable() {            @Override            public void run() {                System.out.println("hello");            }        });    }}

 4.2方法二 

创建一个操作无界队列且只有一个工作线程的线程池

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

4.3方法三

用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,如果线程空闲60秒将收回并移出缓存,创建线程数目动态增长的线程池

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

4.4方法四

创建一个单线程执行器,可以在给定时间后执行或定期执行。

 ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();

4.5方法五

创建一个指定大小的线程池,可以在给定时间后执行或定期执行,是进阶版的Timer

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);

4.6方法六

 创建一个指定大小(不传入参数,为当前机器CPU核心数)的线程池,并行地处理任务,不保证处理顺序

Executors.newWorkStealingPool();

4.7方法七

自定义线程池,工作中使用这种方法创建线程池

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,                10,                10000,                TimeUnit.MILLISECONDS,                new LinkedBlockingQueue());

五、模拟实现一个线程池

设置一个具有十个线程的线程池,打印0-1000个数。

其中在构造方法中调用十个线程执行,submit方法进行放入任务!!

class MyThreadPool{    private BlockingQueue queue = new LinkedBlockingQueue<>();    public void submit(Runnable runnable) throws InterruptedException {        queue.put(runnable);    }    public MyThreadPool(int n){        for (int i = 0; i < n; i++) {            Thread t = new Thread(() -> {                try {                    while (true){                        Runnable runnable = queue.take();                        runnable.run();                    }                } catch (InterruptedException e) {                    e.printStackTrace();                }            });            t.start();        }    }}public class ThreadDemo {    public static void main(String[] args) throws InterruptedException {        MyThreadPool pool = new MyThreadPool(10);        for (int i = 0; i < 1000; i++) {            int number = i;            pool.submit(new Runnable() {                @Override                public void run() {                    System.out.println("hello "+ number);                }            });        }        Thread.sleep(3000);    }}

可见,线程池中任务的执行的顺序和添加顺序不一定相同,因为这十个线程是无序调度的

来源地址:https://blog.csdn.net/asad21654864/article/details/129800272

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

线程池是什么?线程池(ThreadPoolExecutor)使用详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用

这篇文章主要介绍了python中ThreadPoolExecutor线程池和ProcessPoolExecutor进程池怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中ThreadPoolE
2023-07-02

java线程池ThreadPoolExecutor类怎么用

这篇文章将为大家详细讲解有关java线程池ThreadPoolExecutor类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许
2023-06-29

怎么理解ThreadPoolExecutor线程池技术

本篇文章为大家展示了怎么理解ThreadPoolExecutor线程池技术,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是一门多线程的语言,基本上生产环境的Java项目都离不开多线程。而线程
2023-06-19

ThreadPoolExecutor线程池原理及其execute方法(详解)

jdk1.7.0_79 对于线程池大部分人可能会用,也知道为什么用。无非就是任务需要异步执行,再者就是线程需要统一管理起来。对于从线程池中获取线程,大部分人可能只知道,我现在需要一个线程来执行一个任务,那我就把任务丢到线程池里,线程池里有空
2023-05-31

Java线程池ThreadPoolExecutor怎么创建

本篇内容介绍了“Java线程池ThreadPoolExecutor怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介ThreadPo
2023-07-02

Python之ThreadPoolExecutor线程池问题怎么解决

本文小编为大家详细介绍“Python之ThreadPoolExecutor线程池问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python之ThreadPoolExecutor线程池问题怎么解决”文章能帮助大家解决疑惑,下面跟
2023-07-05

SpringBoot线程池和Java线程池怎么使用

这篇文章主要介绍“SpringBoot线程池和Java线程池怎么使用”,在日常操作中,相信很多人在SpringBoot线程池和Java线程池怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringB
2023-07-06

Android线程池是什么

本篇内容主要讲解“Android线程池是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android线程池是什么”吧!我们都知道线程池的用法,一般就是先new一个ThreadPoolExec
2023-06-22

什么是java线程池

使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?今天给大家分享Java四种线程池的使用方法。线程池介绍:线程池是一种多线程处理形式,处理过程
什么是java线程池
2017-06-28

java线程池详解

线程池概述1. 线程池就是一个管理线程的池子,可以降低创建和销毁线程带来的资源消耗因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。2. 提高响应速度,任务到达了相对于从线程池取线程,自己创建
java线程池详解
2015-04-06

java线程池是什么

java的线程池是什么,有哪些类型,作用分别是什么 (推荐学习:java课程)线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果
java线程池是什么
2016-06-22

怎么在Java并发包中使用ThreadPoolExecutor线程池

这篇文章给大家介绍怎么在Java并发包中使用ThreadPoolExecutor线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、线程池简介线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供
2023-06-15

怎么在java中使用ThreadPoolExecutor创建一个线程池

这篇文章给大家介绍怎么在java中使用ThreadPoolExecutor创建一个线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发
2023-06-14

springboot使用线程池方法是什么

本篇内容主要讲解“springboot使用线程池方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot使用线程池方法是什么”吧!线程池创建@Configuration@En
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录