线程池(ThreadPoolExecutor)

目录

一、线程池

标准提供的线程池

ThreadPoolExecutor

自定义线程池


一、线程池

为什么要引入线程池?

这个原因我们需要追溯到线程,我们线程存在的意义在于,使用进程进行并发编程太重了,所以引入了线程,因为线程又称为 “轻量级进程”,创建线程比创建进程更加有效,调度线程更加的高效。
但当我们的并发程度的提高,我们线程应该不太满足我们的要求,线程显得也不是那么的轻,那么想要提升效率,有两个解决方案:

  1. 引入"更轻量的线程",是存在这个东西的,那就是"协程/纤程",但是我们的java并没有引入这个概念,所以我们这个方案就泡汤了,相比之下Go语言在并发编程这一块就更香了,因为Go内置了协程。
  2. 使用线程池,来降低创建和销毁线程的开销。

肯定会有同学问,为什么引入线程池就会降低开销?
首先我们创建线程和销毁线程是由操作系统内核来控制的,我们人为无法干涉。但是如果引入线程池,我们事先就可以将线程创建好放入"线程池"中,后面需要的时候,直接从池子中取,用完归还到池子中,这样就省去了频繁的创建和销毁线程的开销。

标准提供的线程池

JDK5.0开始,提供了代表线程池的接口: ExecutorService
 

如何得到线程池对象?
方式一: 使用Executors(线程池的工具类)调用方法,返回不同类型的线程池。

我们可以发现我们Executors线程池的工具类下面为我们提供了很多不同应用场景的线程池。
细心的同学可以发现,我们这里并不是直接去new 一个线程池,而是调用Executors的一个方法返回一个对象。
我们使用某个类的静态方法,直接构造出来一个对象(相当于我们的new操作隐藏在了方法里面),我们称这样的方法为 “工厂方法“,提供这个工厂方法的类,称为"工厂类”,我们这种思想就是"工厂模式” 的一种 “设计模式”.我们后面会详细介绍。

ThreadPoolExecutor

方式二: 使用ExecutorService的实现类ThreadPoolExecutor自己创建一个线程池对象。

我们通过ThreadPoolExecutor源码中查看一下ThreadPoolExecutor的构造方法,我们可以发现有不同参数的构造方法,我们这里介绍参数最多参数的构造方法,这个构造方法覆盖了前面几个

我们再来详细的介绍一下这几个参数

我们这里有两个比较重要的问题
1.临时线程什么时候创建?
当新任务提交时,发现核心线程都在忙,而且任务队列也满了,并且还可以创建临时线程,才会创建临时线程
2.什么时候会开始拒绝任务?
核心线程和临时线程都在忙,任务队列也满了,新的任务过来时,才会开始拒绝任务。

拒绝策略会抛异常

public static void main(String[] args) throws InterruptedException {
        //定义一个线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3
                ,5,1,
                TimeUnit.SECONDS,new LinkedBlockingQueue<>(5),
        new ThreadPoolExecutor.AbortPolicy());//拒绝策略
        for (int i = 0; i < 100; i++) {
            int taskId=i+1;
            threadPoolExecutor.submit(()->{
                System.out.println("执行任务"+taskId+","+Thread.currentThread().getName());
            });
        }
    }

自定义线程池

public class MyThreadPool {
    //定义阻塞队列来报关任务
    BlockingQueue<Runnable> queue=new LinkedBlockingQueue<>(100);

    public MyThreadPool(int threadNum) {
        if (threadNum <= 0) {
            throw new IllegalArgumentException("线程数量必须大于0");
        }

        //创建线程
        for (int i = 0; i < threadNum; i++) {
            Thread thread = new Thread(() -> {
                try {
                    while (true) {
                        Runnable runnable = queue.take();
                        runnable.run();
                    }
                    } catch(InterruptedException e){
                        throw new RuntimeException(e);
                    }

            });
            thread.start();
        }
    }

    //提交方法
    public void submit(Runnable runnable) throws InterruptedException {
        if(runnable==null){
            throw new IllegalArgumentException("任务不能为空");
        }
        queue.put(runnable);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/935836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

hbase读写操作后hdfs内存占用太大的问题

hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…

【IntelliJ IDEA 集成工具】TalkX - AI编程助手

前言 在数字化时代&#xff0c;技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量&#xff0c;他们需要一个强大而专业的工具来辅助开发过程&#xff0c;而正是为了满足这一需求&#xff0c;TalkX 应运而生。 一、概述 1…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

React 第十六节 useCallback 使用详解注意事项

useCallback 概述 1、useCallback 是在React 中多次渲染缓存函数的 Hook&#xff0c;返回一个函数的 memoized的值&#xff1b; 2、如果多次传入的依赖项不变&#xff0c;那么多次定义的时候&#xff0c;返回的值是相同的,防止频繁触发更新&#xff1b; 3、多应用在 父组件为函…

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…

Windows系统VSCode 搭建ESP-IDF环境

VS Code&#xff0c;安装ESP-IDF插件 快捷键CTRLSHIFTP&#xff0c;弹出显示所有命令的窗口&#xff0c;选择ESP-IDF的欢迎 使用第一个选项&#xff0c;要选择一个ESP-IDF版本&#xff0c;选最新的就行 点击Install,等待下载 提示安装成功&#xff0c;如果过程中出现python已存…

PR裁剪与删除

剪切 剪切片段 工具面板的第四个工具&#xff0c;剃刀工具&#xff0c;在英文输入法下可以使用快捷键C来切换&#xff0c;或者直接使用CtrlK进行裁剪。 CtrlK&#xff1a;选中剪辑后会在指针处进行裁剪。 剃刀工具&#xff1a;在执行位置剪裁&#xff0c;包括连接在一起的素材…

基于物联网的 AI 智能送药车与自维护基站系统研究

一、引言 &#xff08;一&#xff09;研究背景 随着科技的飞速发展&#xff0c;物联网技术在各个领域都展现出了巨大的潜力。在医疗领域&#xff0c;物联网技术的应用为提高医疗服务的效率和质量带来了新的机遇。其中&#xff0c;基于物联网的 AI 智能送药车与自维护基站系统…

TÜLU 3: Pushing Frontiers inOpen Language Model Post-Training

模型&#xff1a;https://huggingface.co/allenai 技术报告&#xff1a;https://allenai.org/papers/tulu-3-report.pdf 数据集&#xff1a;https://huggingface.co/collections/allenai/tulu-3-datasets-673b8df14442393f7213f372 GitHub&#xff1a;https://github.com/al…

123213124

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 总体感觉偏简单&#xff0c;但是知识点记得不牢&#xff0c;估计机会不大。 今日 12.11 &#xff0c;成绩已出&#xff0c;每科总分 75分&#xff0c;全部45分以上为通过。 成绩总…

数据结构10——排序

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题&#xff1a; 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…

Envoy 服务发现原理大揭秘与核心要点概述

1 Envoy动态配置介绍 动态资源&#xff0c;是指由envoy通过xDS协议发现所需要的各项配置的机制&#xff0c;相关的配置信息保存 于称之为管理服务器&#xff08;Management Server &#xff09;的主机上&#xff0c;经由xDS API向外暴露&#xff1b;下面是一个 纯动态资源的基…

PYNQ - 自定义含 DPU 的 overlay 层(MPSoC)

目录 1. 简介 2. 通过脚本构建 2.1 准备工作 2.2 通过 Makefile 构建 2.3 Makefile 源码及解析 2.3.1 源码-中文注释 2.3.2 主要功能分析 2.3.3 vivado batch 模式 2.3.4 package_xo 命令 2.3.5 vitis v 命令 2.4 DPU 参数 2.4.1 Arch 选项卡 2.4.2 Advanced 选项…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型&#xff0c;结合了深度学习和声学技术&#xff0c;能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成&#xff0c;即使没有直接的训练数据&#xff0c;模型仍能生成相似风格的语音。用户可以通过微调模…

25.DDD数量关系

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗&#xff1f;领域对象之…

GB28181系列二:TS、PS格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、TS、PS简介 二、PES格式 三、TS格式 3.1 固定字段 3.2、调整域(Adaptation field) 3.3、第一个可选域(optional fields) 3.4、第二个可选域(optional fields) 3.5、负载 3.6、PSI 四、PS格式 4.1、PS头…

OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

QT 国际化(翻译)

QT国际化&#xff08;Internationalization&#xff0c;简称I18N&#xff09;是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用&#xff0c;并且可以根据用户的语言和地区提供本地化的使用体验。…

【大语言模型】LangChain 核心模块介绍(Chains、Retrieval、Tools)

【大语言模型】LangChain 核心模块 一、LangChain 核心模块 Chains1、简介2、应用场景3、使用技巧3.1、LCEL Chains3.2、Legacy Chains 4、实践演练 二、LangChain 核心模块 Retrieval1、简介2、应用场景2.1、需求说明2.2、实现思路 三、LangChain 核心组件 Tools1、应用场景2、…