线程池的学习(一)

news2024/11/25 16:20:51

转载:Java 线程池

线程池的创建方式

方式一:创建单一线程的线程池 newSingleThreadExecutor

特点:

  • 线程池中只包含 1 个线程,存活时间是无限的
  • 按照提交顺序执行任务
  • 唯一线程繁忙时,新提交的任务会被加入到阻塞队列中的,阻塞队列是无限的
  • 适用场景:要求任务按ti执提交次序执行时
 static class TargetTask implements Runnable {
        public static final int SLEEP_GAP = 1000;
        // AtomicInteger 提供了一种线程安全的方式来对整数进行操作。它可以保证多个线程同时对同一个AtomicInteger对象进行操作时,不会出现数据竞争和不一致的情况
        static AtomicInteger taskNo = new AtomicInteger(0);
        String taskName;

        @Override
        public void run() {
            log.info(taskName + "is running ...");
            try{
                Thread.sleep(SLEEP_GAP);
            }catch (Exception e){
                log.error(taskName + "running error !");
                e.printStackTrace();
            }
            log.info(taskName + "is  end ...");

        }
        TargetTask(){
            taskName = "task_" + taskNo;
            taskNo.incrementAndGet();
        }
    }

    public static void main(String[] args) throws InterruptedException {
//         方式一:创建单一线程的线程池 newSingleThreadExecutor
        ExecutorService poll1 = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 2; i++) {
            poll1.execute(new TargetTask());
            poll1.submit(new TargetTask());
        }
        poll1.shutdown();
    }
  }

在这里插入图片描述

方式二:创建指定线程数量的线程池 newFixedThreadPool

  • 如果线程池中任务没有达到『固定数量』,每次提交任务线程池中就会创建新的线程。
  • 如果线程数量达到『固定数量』,新提交的任务就会加到阻塞队列中,并且阻塞队列是无界的。
  • 如果线程池中的线程因为执行任务而异常了,那么线程池中就会补一个新的线程
  • 适用场景:需要任务长期执行的场景,CPU 密集型场景
  • 缺点:当突增大量任务时,阻塞队列无限增大,服务器资源迅速耗尽
// 方式二:创建指定线程数量的线程池 newFixedThreadPool
        ExecutorService poll2 = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 2; i++) {
            poll2.execute(new TargetTask());
            poll2.submit(new TargetTask());
        }
        poll2.shutdown();

如图:最多只有3个线程同时进行
在这里插入图片描述

方式三:创建可缓存的线程池 newCachedThreadPool

  • 新增加任务时,如果线程池内的线程均繁忙,则会新增加线程来执行
  • 如果部分线程空闲,超过60s则会进行线程回收,则被终止并移出缓存
  • 适用场景:需要快速处理突发性强,耗时短的线程,如Netty的NIO处理场景、REST API接口的瞬时削峰场景
  • 缺点:当突增大量任务时,创建线程过多导致资源耗尽
ExecutorService poll3 = Executors.newCachedThreadPool();
        for (int i = 0; i < 2; i++) {
            poll3.execute(new TargetTask());
            poll3.submit(new TargetTask());
        }
        poll3.shutdown();

如图:只要有新的任务,就会开辟线程
在这里插入图片描述

方式四:创建可调度线程池 newScheduledThreadPool

  • 首次执行任务可以设置延迟时间
  • 具有周期性,主线程睡眠时间越长,线程池中的周期次数越多
ScheduledExecutorService poll4 = Executors.newScheduledThreadPool(3);
        for (int i = 0; i < 5; i++) {
            // 参数1: task任务
            // 参数2: 首次执行任务的延迟时间
            // 参数3: 周期性执行的时间
            // 参数4: 时间单位
            poll4.scheduleAtFixedRate(new TargetTask(),0,500, TimeUnit.MILLISECONDS);
        }
        Thread.sleep(4000); //主线程睡眠时间越长 周期次数越多
        poll4.shutdown();

如图:周期性的执行任务
在这里插入图片描述

方式五: ThreadPoolExecutor 标准的创建方式

  • 最原始的线程池创建,上面1-3创建方式都是对ThreadPoolExecutor的封装
// 方式五: ThreadPoolExecutor 标准的创建方式,上面1-3 种方式都是ThreadPoolExecutor的变种
        // 参数1: 核心线程数量
        // 参数2: 最大线程数量
        // 参数3: 核心线程之外的空闲线程的存活时间
        // 参数4: 存活时间的单位
        // 参数5: 阻塞队列
        
        // 下面这种形式类似于方式二,创建固定数量的线程数
        ExecutorService poll5 = new ThreadPoolExecutor(3, 3,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>());

        for (int i = 0; i < 2; i++) {
            poll5.execute(new TargetTask());
            poll5.submit(new TargetTask());
        }
        poll5.shutdown();

如图:最多启动3个线程执行任务
在这里插入图片描述

总结:

  • newFixedThreadPool和newSingleThreadExecutor: 阻塞队列无界,会堆积大量任务导致OOM(内存耗尽)
  • newCachedThreadPool和newScheduledThreadPool: 线程数量无上界,会导致创建大量的线程,从而导致OOM
  • 建议直接使用线程池ThreadPoolExecutor的构造器

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java springBoot项目报LDAP health check failed

报错内容如下&#xff1a; 在bootstrap.yml文件里加 management:health:ldap:enabled: false 配置。 或者在application.properties文件里加&#xff1a; management.health.ldap.enabledfalse 参考答案&#xff1a;LDAP health check failed 难道没有人遇到这样的问题吗&…

我造了一个新的词汇:信息湍流

信息湍流 信息湍流的简介起因有出现信息湍流的领域如何做信息湍流的计算 信息湍流的简介 在物流学中&#xff0c;一个物体从一个位置到另外一个位置&#xff0c;我们可以通过精确的公式计算来预测出新位置。 而水和气体则是大量一个一个物体组成的新物体&#xff0c;称为&…

Docker安装以及基础镜像的使用

Docker 安装 Docker 要求 CentOS 系统的内核版本高于 3.10 uname -r使用 root 权限登录 su # 输入密码更新 yum yum -y update卸载旧版本的 docker yum remove ‐y docker*安装需要的软件包 yum -y install yum-utils设置 yum 源&#xff0c;并更新 yum 包的索引 yum-config-ma…

凝心聚力,同为科技(TOWE)2023年中会议暨团建活动圆满举行

01凝心聚力 奋勇冲刺——年中会议现场 年中会议现场 时光冉冉&#xff0c;2023年已过半&#xff0c;7月4日-11日&#xff0c;为回望过往、总结成果、复盘经验&#xff0c;确保顺利完成公司年度目标&#xff0c;增强团队凝聚力、激发员工活力&#xff0c;深化企业文化建设&…

15 - 堆栈 - 大顶堆

前面我们学习了小顶堆,相信大家都已经有点概念了,今天来了解一下大顶堆。 大顶堆示意图 堆数组存放的公式 我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && a…

两股热潮如何汇聚:当数字孪生遇上元宇宙

引言 随着科技的迅猛发展&#xff0c;数字孪生和元宇宙已成为当今技术界备受关注的两股热潮。这两个概念各自都在不同领域取得了突破性进展&#xff0c;但在最近的发展中&#xff0c;人们开始发现它们之间存在着潜在的契合点。本文将探讨数字孪生和元宇宙的定义、特点&#xf…

【【51单片机蜂鸣器实现起风了】】

哀伤如同风&#xff0c;消失无影踪。 前面的有两个非常关键的点希望兄弟们明白 我一开始也失算了 这里兄弟们注意务必改成int 不然会超出 就会出现播放一半从头开始的情况 下面是两份起风了代码直接附上main.c 因为另外的其实和我之前说的模板都一样复制粘贴就行 为什么是…

M1 Mac如何安装CentOS7虚拟机(图文详细解说)

1、下载相应的文件 2、打开VMware Fusion pro进行安装 3、 输入许可证密钥 4、 将CentOS-7拖入“从光盘或映像中安装”中 5、点击继续 6、选择其他-->其他64位ARM-->继续 7、进行自定设置 8、这里更改名为“Centos7”&#xff08;不要加空格&#xff09;&#xff0c;存…

2023 Testing Expo倒计时-聚焦Softing 9003展位

请点击此处&#xff0c;即可进行在线登记报名并了解更多信息&#xff01;

ES系列--文档处理

一、文档冲突 当我们使用 index API 更新文档 &#xff0c;可以一次性读取原始文档&#xff0c;做我们的修改&#xff0c;然后重 新索引 整个文档 。 最近的索引请求将获胜&#xff1a;无论最后哪一个文档被索引&#xff0c;都将被唯一存 储在 Elasticsearch 中。如果其他人同时…

Java-生成数据库设计文档

目录 场景screw 官网介绍接口编写 场景 在企业开发中&#xff0c;有些公司会要求开发人员编写数据库表结构文档&#xff0c;这项工作没啥技术含量而且很繁琐&#xff0c;每当有表发生更改时就需要维护这个文档&#xff0c;或者是需要交付数据库设计文档和导出数据库设计文档这类…

8月|龙讯旷腾高性能计算与工业材料模拟论坛2023

2023年8月25日 山东青岛 高性能计算与工业材料模拟论坛2023 青岛&#xff0c;别称岛城&#xff0c;国务院批复确定的中国沿海重要中心城市和滨海度假旅游城市&#xff0c;国家历史文化名城、中国帆船之都、世界啤酒之城、联合国电影之都&#xff0c;也是国家海洋科研和教育中…

【产品经理】TO B市场分析

市场分析是一个独立而又宏大的学科领域&#xff0c;并且具体使用中&#xff0c;目标和个体不同&#xff0c;分析的方式方法也不同。TO B产品的市场分析是对市场环境、市场规模、性质、特征、竞品进行分析&#xff0c;从而寻找和研究潜在需求的市场机会&#xff0c;帮助产品经理…

设计模式大白话——工厂模式

文章目录 设计模式大白话——工厂模式1.1、简单工厂:1.2、工厂方法1.3、抽象工厂 设计模式大白话——工厂模式 1.1、简单工厂: 场景与思路 ​ 现在需要开一个 Pizza 店&#xff0c;Pizza 店可以生产各种口味的 Pizza ​ 既然要生产各种各样的 Pizza&#xff0c;那就会很容易想…

管理类联考——英语——趣味篇——不择手段——d开头单词

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

SignalTap II 软件使用步骤

文章目录 前言一、SignalTap II是什么&#xff1f;二、使用步骤三、总结四、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、板子型号&#xff1a;原子哥开拓者2(EP4CE10F17C8) 要求&#xff1a; 能够使用SignalTap II进行片上调试。 一、SignalTap II是什么&#xff1f; S…

海外媒体发稿:链游媒体发稿写作方法及优缺点解析

链游媒体发稿是一种新的媒体发布机制&#xff0c;它可以把信息准确、及时、有效地传播给大量的人&#xff0c;帮助企业实现信息的最大化传播&#xff0c;因此越来越多的公司也开始使用链游媒体发稿服务&#xff0c;本文就介绍链游媒体发稿写作的方法及小技巧。 一、链游媒体发稿…

Kubernetes Service的过程

文章目录 Kubernetes Service的实现基础内容1. 命令 ip route show table all2. DNAT3. IPVS和iptables4. Service Service的实现简述 Kubernetes Service的实现 基础内容 在了解Service之前,需要先了解一些额外的知识: 命令: ip route show table allDNATIPVS和iptables基础…

MNE脑电数据预处理

MNE 官网链接 导包 import mne import matplotlib.pyplot as plt加载数据集 不同格式数据集使用的函数不同&#xff0c;具体在官网搜索 raw mne.io.read_raw_brainvision(r"test.vhdr", preloadTrue)此语句为了画图方便 %matplotlib降采样 raw.resample(200)…

Vue3统计数值(Statistic)

可自定义设置以下属性&#xff1a; 数值的标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’数值的内容&#xff08;value&#xff09;&#xff0c;类型&#xff1a;string | number&#xff0c;默认&#xff1a;…