在项目中使用——newFixedThreadPool线程池

news2024/11/18 6:19:31

newFixedThreadPool线程池

  • 前言
  • newFixedThreadPool的介绍
    • 使用newFixedThreadPool的步骤
      • 实例化一个固定线程大小线程池
      • 创建一个用于启动新线程的类
      • 使用submit提交线程
      • 最后关闭关闭线程池
    • CountDownLatch配合线程池使用
      • 构造CountDownLatch
      • 计数器减一
      • 使调用该方法的线程处于等待状态,当倒数到0时主线程才执行。
    • 示例:使用线程池的方式,计算1000名学生的学习数据
      • Main类,用于初始化线程池大小、线程提交任务
      • CalculationStudentsData类:用于执行线程,并执行具体的业务
      • 执行结果的部分截图
  • 思考
  • 如果博主的文章对您有所帮助,可以<font color=orange>评论、<font color=green>点赞、<font color=bule>收藏,<font color=black>支持一下博主!!!

前言

本篇博客的目的是让大家能够熟练的简单运用newFixedThreadPool线程池并且能够运用到具体的 项目开发中。
通过本篇博客你将完全掌握newFixedThreadPool线程池的基本运用,使用多线程进行开发。

newFixedThreadPool的介绍

newFixedTheadPool是六种常用线程池的其中一种,newFixedThreadPool的特点是他的核心线程数和最大线程数是一致的,并且是一个固定线程数的线程池。线程池的大小一旦达到最大值后,再有新的任务提交时则放入无界阻塞队列中,等到有线程空闲时,再从队列中取出任务继续执行。

newFixedThreadPool的特点:

1.创建的线程数量固定
2.创建的线程可以重复使用
3.提交一个任务,就创建一个线程,直到达到线程池的最大容量
4.有执行异常结束的线程,线程池会补充一个新的线程
5.使用无边界的队列来存储需要执行的任务
6.使用完成,需要手动关闭线程池
正是由于这些特性,使用newFixiedThreadPool进行多线程开发十分简单。

使用newFixedThreadPool的步骤

实例化一个固定线程大小线程池

//实例化一个固定大小为60个线程的newFixedThreadPool线程池
ExecutorService excutorService = Executors.newFixedThreadPool(60);

创建一个用于启动新线程的类

该类需要实现Runnable接口,并实现Runnable中的run方法
run方法中填写具体的需要线程执行的业务逻辑

public class PrintThread implements Runnable{
    public void run(){
            
        }
    }
}

使用submit提交线程

excutorService.submit();

最后关闭关闭线程池

excutorService.shutdown();

CountDownLatch配合线程池使用

CountDownLatch的作用就是等待其他线程都执行完任务,然后主线程才继续往下执行。

CountDownLatch适合于对任务进行拆分,使其并行执行,比如某个任务执行10s,其对数据的请求可以分为五个部分,那么就可以将这个任务拆分为5个子任务,分别交由五个线程执行,执行完成之后再由主线程进行汇总,此时,总的执行时间将决定于执行最慢的任务,平均来看,还是大大减少了总的执行时间。

CountDownLatch主要有两个方法:countDown()和await()。
countDown()方法用于使计数器减一,await()方法则使调用该方法的线程处于等待状态,一般为主线程。当倒数到0时主线程才执行。

CountDownLatch使用主要步骤:在构造CountDownLatch的时候需要传入一个整数n,每一个线程执行完一个任务倒数一次。在这个整数倒数到0之前,主线程需要进行等待。倒数到0主线程才执行。

构造CountDownLatch

final CountDownLatch latch = new CountDownLatch(60);//初始化,计数器容量为60

计数器减一

latch.countDown();//计数器容量减一

使调用该方法的线程处于等待状态,当倒数到0时主线程才执行。

latch.await();

示例:使用线程池的方式,计算1000名学生的学习数据

Main类,用于初始化线程池大小、线程提交任务

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : Main
 * @description : [初始化线程池,线程提交任务]
 * @createTime : [2022/12/28 9:20]
 * @updateUser : [WangWei]
 * @updateTime : [2022/12/28 9:20]
 * @updateRemark : [描述说明本次修改内容]
 */
public class Main {
    public static void main(String[] args) {
        //实例化一个固定大小为5个线程的newFixedThreadPool线程池
        ExecutorService excutorService = Executors.newFixedThreadPool(10);
        //构造CountDownLatch传入数量为1000,初始化的计数器大小为1000,与学生数量对应。
        final CountDownLatch latch = new CountDownLatch(1000);
        //计算1000个学生的学习数据
        for (int i = 0; i <1000 ; i++) {
            //线程提交任务
            excutorService.submit(new CalaulationStudentsData(i,latch));
        }
        try{
            //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行。
            latch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException("学生学习数据普通版多线程处理异常",e);
        }
        //关闭线程池
        excutorService.shutdown();
    }
}

CalculationStudentsData类:用于执行线程,并执行具体的业务

import java.util.concurrent.CountDownLatch;

/**
 * @author : [WangWei]
 * @version : [v1.0]
 * @className : CalaulationStudentsData
 * @description : [计算学生学习数据]
 * @createTime : [2022/12/28 9:24]
 * @updateUser : [WangWei]
 * @updateTime : [2022/12/28 9:24]
 * @updateRemark : [描述说明本次修改内容]
 */
public class CalculationStudentsData implements Runnable{
    int studentNumber;
    CountDownLatch latch;

    /*
     * @version V1.0
     * Title: CalculationStudentsData
     * @author Wangwei
     * @description 构造函数中传入学生编号
     * @createTime  2022/12/28 9:29
     * @param [studentNumber]
     * @return
     */
    public CalculationStudentsData(int studentNumber, CountDownLatch latch){
        this.studentNumber=studentNumber;
        this.latch=latch;
    }
    /*
     * @version V1.0
     * Title: run
     * @author Wangwei
     * @description 执行线程
     * @createTime  2022/12/28 9:30
     * @param []
     * @return void
     */
    @Override
    public void run() {
        try {
            //计算学生学习数据的方法
            this.CalculationStudentData();
            //计数器减一
            latch.countDown();
        }catch (Exception e){
            throw new RuntimeException("学生学习数据子线程执行数据异常"+e);
        }
    }
    /*
     * @version V1.0
     * Title: CalaulationStudentData
     * @author Wangwei
     * @description 计算学生学习数据的方法
     * @createTime  2022/12/28 9:32
     * @param []
     * @return void
     */
    private void CalculationStudentData(){
    	//输出学生编号和执行该任务的线程名称
        System.out.println("完成学生"+studentNumber+"的学习成绩计算"+Thread.currentThread().getName());
    }
}

执行结果的部分截图

在这里插入图片描述
在这里插入图片描述

思考

1.除了介绍的newFixedThreadPool之外还有哪些线程池?
2.除了上面介绍的submit的提交任务的方式,还有哪些提交任务的方式?
3.线程池有哪些功能?
4.线程池或者是说多线程的应用场景?

如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!!!

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

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

相关文章

推荐 12 月 yyds 的开源项目

本期推荐开源项目目录&#xff1a;1. 面向 API 的低代码平台2. 京东抢购自动下单助手3. 开发人员使用的低代码平台4. 好用又强大的开源建站工具5. OCR 图片转文字识别软件6. 互联网仍有记忆01面向 API 的低代码平台APITable 一个面向 API 的低代码平台&#xff0c;用于构建协作…

推荐系统从入门到入门(2)——简单推荐系统构建(无框架、Tensorflow)

本系列博客总结了不同框架、不同算法、不同界面的推荐系统&#xff0c;完整阅读需要大量时间&#xff08;又臭又长&#xff09;&#xff0c;建议根据目录选择需要的内容查看&#xff0c;欢迎讨论与指出问题。 系列文章梗概 本次大作业主要是以电影推荐系统为例&#xff0c;介绍…

GIC V3 V4 逻辑组件

GIC V3 & V4 逻辑组件1 GIC V3逻辑组件2 GIC 各组件的介绍2.1 Distributor2.2 Interrupt translation service, ITS2.3 Redistributor2.4 CPU interface1 GIC V3逻辑组件 The GICv3 architecture consists of a set of logical components: • A Distributor.• A Redist…

C++ 实现Manacher算法

前言 Manacher算法是一种回文串查找算法&#xff0c;专门用于处理查找字符串中的回文子串操作。虽然这个算法本身只是用于查找回文子串&#xff0c;但是它的查找思想还是非常值得学习的。由于Manacher算法是基于暴力解法优化而来的&#xff0c;所以在阅读正式的算法之前&#…

arthes—线上debug好帮手

arthes简介 以下是arthes官网原文&#xff1a; 通常&#xff0c;本地开发环境无法访问生产环境。如果在生产环境中遇到问题&#xff0c;则无法使用 IDE 远程调试。更糟糕的是&#xff0c;在生产环境中调试是不可接受的&#xff0c;因为它会暂停所有线程&#xff0c;导致服务暂…

粒子滤波原理和MATLAB代码实现

理论基础1&#xff1a; (a) Prediction Use the transition equation to propagate the particles: (b) Update Use the measurement equation to obtain measurements of the propagated particles and their standard deviations: (in the case of our program, ym is obt…

如何在 Manjaro Linux 上安装 ONLYOFFICE 桌面编辑器

ONLYOFFICE 桌面编辑器是一款免费开源办公套件&#xff0c;其中包括适用于文本文档、电子表格与演示文稿的离线编辑器。同时&#xff0c;您还可将应用程序连接至云端&#xff08;ONLYOFFICE、Nextcloud 等&#xff09;以便在线开展文档协作。该应用的源代码已根据 AGPL v.3.0 许…

业务中台10讲2.0合辑(推荐收藏)

目录V3.0迭代内容&#xff1a; 增加最近更新的中台系列文章至本目录&#xff1b;根据最新热点修订并调整部分未更新内容方向&#xff1b;为各文章标注《中台产品经理宝典》书中原文出处&#xff1b;本目录使用方法&#xff1a; 本目录推文为中台内容系列中的业务中台子类新原…

华润微功放CS3850EO,2×40W D 类音频功率放大电路,替换:智浦芯CS8673,TI的TAS5780、TAS5754,国产功放

1、概述 CS3850EO 是一款典型输出功率为 40W 立体声的 D 类音频功率放大电路&#xff0c;适用于拉杆音箱、高级桌面音响等场合。 特点 ● 工作电压范围&#xff1a;8V~26V ● 典型输出功率&#xff1a;30W2 20V、8Ω、THD10% 40W2 18V、4Ω、THD10% 50W2 26.5V、8Ω、…

你以为Shell只是命令行?读懂这篇文,给你的工作赋能

可以使用adb tcpip 端口在Android设备上启动一个指定的端口&#xff0c;然后使用adb connect Android设备ip:端口远程连接Android设备。 uiautomator 是一个 java 库&#xff0c;包含用于创建自定义功能UI测试的API&#xff0c;以及用于自动执行和运行测试的执行引擎。使用uiau…

Transformer与看图说话

&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5;&#x1f3c5; 一年一度的【博客之星】评选活动已开始啦 作为第一…

Redis的持久化技术

1. 前言 今天呢&#xff0c;我们来了解下Redis的持久化技术。都知道Redis是内存型key-value型数据库。其实叫缓存中间件更合适。既然是内存性数据库就知道存入磁盘的必要性了。所以就需要持久化技术来支持了 2. 合适人群 对Redis 持久化技术不了解的人 3. RDB RDB 其实就是Re…

推荐三款 Mac 上的理财神器 iCompta、Rublik、UctoX

推荐三款 Mac 上的理财神器 iCompta、Rublik、UctoX 今天推荐三款理财神器&#xff0c;像个人的话可以使用 iCompta&#xff08;个人财务管理&#xff09;一款软件就好了&#xff0c;但有些朋友可能有关注汇率的需求&#xff0c;可以使用 Rublik&#xff08;汇率动态&#xff…

尚硅谷密码学

密码学1. 密码学1.1. 密码学基本概念1.2 密码学的历史1.2.1 古典密码学1.2.1.1. 替换法1.2.1.2移位法1.2.1.2 古代密码学的破解方式1.2.2 进代密码学1.2.3 现代密码学1.2.3.1 散列函数1.2.3.2 对称密码1.2.3.3 非对称密码1.2.4 如何设置密码才安全1.2.5 ASCII编码1.3 凯撒加密1…

Ant Design Pro入门

目录 一&#xff1a;了解Ant Design Pro 二&#xff1a;快速入门 一&#xff1a;了解Ant Design Pro Ant Design Pro 是基于Ant Design的一个开箱即用的&#xff0c;企业级中后台前端/设计解决方案。 效果&#xff1a;源码地址&#xff1a;https://github.com/ant-design/ant…

Linux制作和使用动静态库

文章目录一、概念1.1 动态库和静态库1.2 动态链接和静态链接二、制作第三方库2.1 生成静态库① 制作静态库② 使用静态库2.2 生成动态库① 制作动态库② 使用动态库三、相关题目一、概念 1.1 动态库和静态库 静态库与动态库本质都是一堆目标文件(xxx.o)的集合&#xff0c;库的…

MySQL 索引之道

文章目录1. 索引的介绍2. 索引的本质3. 索引的结构3.1 Hash3.2 B树3.3 常见面试题之为什么用B树4. 索引的分类4.1 功能逻辑层次4.2 存储形式层次5. 索引的失效5.1 最左前缀原则5.2 索引失效的场景6. 索引常见面试题7. 总结及参考文献1. 索引的介绍 索引是通过某种算法&#xf…

快速学习一门新技术的工作原理(十步学习法来自软技能)

快速学习一门新技术的工作原理 ●如何开始——要想开始使用自己所学的&#xff0c;我需要掌握哪些基本知识&#xff1f; ●学科范围——我现在学的东西有多宏大&#xff1f;我应该怎么做&#xff1f;在开始阶段&#xff0c;我不需要了解每个细节&#xff0c;但是如果我能对该学…

后台交互-首页

目录 后台准备 pom.xml 配置数据源 mybatis-generator 整合mybatis 准备前端的首页的数据 Promise 封装request 会议展示 后台准备 springbootmybatis pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://ma…

数据结构之链表(java语言实现)

链表的底层储存结构&#xff1a; 相对于数组这一需要连续、足够大空间的数据结构&#xff0c;链表只需要利用“指针”将一组零碎的空间(在链表中称之为节点)串联起来&#xff0c;这样就可以避免在创建数组时一次性申请过大的空间二导致有可能创建失败的问题!!! 同时比较两种数…