项目实战-NewFixedThreadPool线程池

news2024/11/24 23:03:20

目录

什么是线程池

线程池的类型

1.CachedThreadPool

2.FixedThreadPool

3.ScheduledThreadPool

4.SingleThreadPool

5.newWorkStealingPool

线程池的好处

1、线程池的重用

2、控制线程池的并发数

3、线程池可以对线程进行管理

线程池的示例

 1.Client启动类

2.具体业务类:实现Runnable接口,并实现了run方法

3.执行结果


什么是线程池

        线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

 

线程池的类型

1.CachedThreadPool

        适合使用在任务量 大但耗时少的任务。

2.FixedThreadPool

        适合使用在任务量比 较固定但耗时长的任务。

3.ScheduledThreadPool

        适合使用在执行 定时任务和具体固定周期的重复任务。

4.SingleThreadPool

        适合使用在多个任务 顺序执行的场景。

5.newWorkStealingPool

        适合使用在很耗 时的任务中。

线程池的好处

1、线程池的重用

        线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。

2、控制线程池的并发数

        控制线程池的并发数可以有效的避免大量的线程池争夺CPU资源而造成堵塞。

3、线程池可以对线程进行管理

        线程池可以提供定时、定期、单线程、并发数控制等功能。比如通过ScheduledThreadPool线程池来执行S秒后,每隔N秒执行一次的任务。


线程池的示例

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

 1.Client启动类

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

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl
 * @Author: Wuzilong
 * @Description: 线程池-多线程
 * @CreateTime: 2022-12-30 08:55
 * @Version: 1.0
 */

public class Client {
    public static void main(String[] args) {
        ExecutorService executorService= Executors.newFixedThreadPool(80);
        //构造CountDownLatch传入数量为10000,初始化的计数器大小为1000,与学生数量对应。
        List<String> number=new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            number.add( "少了" +i +"袋牛奶");
        }

        final CountDownLatch latch = new CountDownLatch(number.size());
        //计算1000个学生的学习数据
        for (int i = 0; i <number.size() ; i++) {
            //线程提交任务
            executorService.submit(new DrinkMilk(i,latch,number));
        }
        try{
            //使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行。
            latch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException("XXX喝牛奶多线程处理异常",e);
        }
        //关闭线程池
        executorService.shutdown();
    }
}
newFixedThreadPool(80):80指的是线程池的固定大小,根据电脑的配置情况来启动对应的线程数
new DrinkMilk(i,latch,number):将具体业务需要用到的对象或者值通过实例化对象以构造函数的形式传到具体业务类中

CountDownLatch(number.size()):等子线程都执行完毕之后,主线程才继续执行。传入的参数要和执行的线程是一致的

2.具体业务类:实现Runnable接口,并实现了run方法

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl
 * @Author: Wuzilong
 * @Description: 具体业务类
 * @CreateTime: 2022-12-30 08:55
 * @Version: 1.0
 */

public class DrinkMilk implements Runnable {
    int drinkMilkNumber;
    CountDownLatch latch;
    List<String> number;
    public DrinkMilk(int drinkMilkNumber, CountDownLatch latch, List<String> number) {

        this.drinkMilkNumber=drinkMilkNumber;
        this.latch=latch;
        this.number=number;
    }

    @Override
    public void run() {
        this.business();
        latch.countDown();
    }

    private void business(){

        System.out.println("XXX喝了"+drinkMilkNumber+"袋牛奶!"+Thread.currentThread().getName());

    }

}

3.执行结果

 

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

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

相关文章

Linux中man手册的使用

在linux中&#xff0c;不管是库函数还是系统调用&#xff0c;都用到man手册来查看函数的三要素(功能、参数、返回值)&#xff0c;这里就详细的介绍一下man手册的使用。这里需要注意的是&#xff1a;对于初学者来说,不能将手册页当教程&#xff0c;因为它只是简明的参考资料. Li…

Linux进程控制详解

目录前言一、进程创建1.1 fork函数初识1.2 写时拷贝1.3 fork常规用法1.4 fork调用失败的原因二、进程终止2.1 进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f;2.2 进程终止的常见方式有哪些&#xff1f;&#xff1f;2.3 如何用代码终止一个进程三、进程等待3.…

Linux学习之操作系统认识

目录操作系统概念初识“管理”总结系统函数和库函数操作系统 概念 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件…

了解并发编程

并发与并行的概念: 并发:一段时间内(假设只有一个CPU)执行多个线程,多个线程时按顺序执行 并行:同个时间点上,多个线程同时执行(多个CPU) 什么是并发编程? 在现代互联网的应用中,会出现多个请求同时对共享资源的访问情况,例如在买票,秒杀与抢购的场景中 此时就会出现线程安…

【排序算法】选择排序(Selection sort)

选择排序(Selection sort)是一种简单直观的排序算法。选择排序介绍它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#xff0c;然后将其存放到数列的起始位置&#xff1b;接着&#xff0c;再从剩余未排序的元素中继续寻找最小(or最大)元素&#xff0c;然后放到已排…

c/c++开发,无可避免的宏定义使用案例

一、c/c宏定义的来源 宏定义&#xff0c;就是用一个标识符来表示一个字符串&#xff0c;如果在后面的代码中出现了该标识符&#xff0c;那么就全部替换成指定的字符串。通常c/c宏定义这几处出处&#xff1a; 1&#xff09;最常见的就是来自于开发者编码过程中采用宏定义命令“#…

发烧友实测 | 飞凌嵌入式OKA40i-C开发板试用体验之远程视频监控

本篇试用报告由发烧友zealsoft提供&#xff0c;感谢zealsoft的支持。飞凌嵌入式会在电子发烧友和电路城论坛持续开展开发板有奖试用活动&#xff0c;更有京东E卡等着你&#xff01;欢迎大家的持续关注。“感谢飞凌嵌入式公司提供了本次OKA40i-C开发板的评测机会。上次我们介绍了…

网络流量传输MTU解析

基本概念 以太网的链路层对数据帧的长度会有一个限制&#xff0c;其最大值默认是1500字节&#xff0c;链路层的这个特性称为MTU&#xff0c;即最大传输单元 Maximum Transmission Unit&#xff0c;最大传输单元&#xff0c;指的是数据链路层的最大payload&#xff0c;由硬件网…

高压放大器在孔道灌浆非线性超声测试中的应用

实验名称&#xff1a;高压放大器在孔道灌浆非线性超声测试中的应用研究方向&#xff1a;无损检测测试目的&#xff1a;超声波作为频率高于20kHz的声波被广泛应用于各类结构的无损检测中&#xff0c;以超声波作为探伤波的无损检测法称为超声波无损检测法&#xff0c;简称超声波法…

嵌入式开发:通过嵌入式虚

嵌入式虚拟化为实现多核处理能力的优势提供了一种可扩展的机制。嵌入式应用中的虚拟化与其企业和桌面应用有许多共同之处。独特的嵌入式使用案例和专业的底层技术为嵌入式开发人员提供了优化性能和响应设计的新机会。在台式机、数据中心以及现在的嵌入式设计中采用多核技术可以…

React hooks之useState用法(一)

系列文章目录 学习React已经有很长的一段时间了&#xff0c;今天决定重新回顾一下跟React相关的一些知识点 文章目录系列文章目录结构如下一、hooks是什么&#xff1f;useState可以能做什么二、如何使用useState&#xff08;&#xff09;第一步&#xff1a;创建【函数组件&…

java 代码

java 分层架构的由来目录概述需求&#xff1a;设计思路实现思路分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. ha…

运维必会:ansible剧本(piaybook)

playbooks 概述以及实例操作 Playbooks 组成部分&#xff1a; Inventory Modules Ad Hoc Commands Playbooks Tasks: 任务&#xff0c;即调用模块完成的某些操作 Variables: 变量 Templates: 模板 Handlers: 处理器&#xff0c;由某时间触发执行的操作 Roles: 角色 YAML 介绍…

Individual Tree Segmentation from LiDAR Point Clouds for Urban Forest Inventory

Abstract 本研究的目的是使用 LiDAR 点云数据开发单棵树级别的自动化城市森林清单的新算法。激光雷达数据包含三维结构信息&#xff0c;可用于估算树高、基高、树冠深度和树冠直径。这使得精确的城市森林库存可以细化到单棵树。与大多数已发布的从 LiDAR 派生的栅格表面检测单…

学了这么久python,不会连自己啥python版本都不知道吧?

人生苦短&#xff0c;我用Python 源码资料电子书:点击此处跳转文末名片获取 查看 Python 版本 我们可以在命令窗口(Windows 使用 winR 调出 cmd 运行框)使用以下命令查看我们使用的 Python 版本&#xff1a; python -V 或 python --version 以上命令执行结果如下&#xff1a; …

Axure 初学者容易涉及的雷区

​工具学习是成为产品经理的一部分学习&#xff0c;工具学习总是伴随着痛苦和煎熬的&#xff0c;因为学习本身就伴随着枯燥和重复。 在未来你的Axure学习可能会出现这些情况呢&#xff1f;还没接触过axure的或者打算进行axure的朋友可能会有疑问。这里根据我们学员学习axure的经…

CentOS8基础篇4:使用U盘备份文件

一、挂载点 所谓的挂载点就是文件系统中存在的一个目录&#xff0c;通常情况下&#xff0c;创建在/mnt目录下&#xff0c;挂载成功后&#xff0c;访问挂载点就是访问新的存储设备。 挂载点应该是空目录&#xff0c;否则原来该挂载点中存在的文件将会被隐藏。而且&#xff0c;…

谷粒学苑第二章前端框架-2.1登录功能

一、vue-admin-template的config模块 vue-admin-template支持多环境&#xff0c;config配置模块提供了dev和prod两种环境。而BASE_API存储的是URL前部分&#xff0c;再拼接上controller的URL&#xff0c;即是完整的URL。修改为自己的协议://ip:port 二、vue-admin-template的s…

.net6API使用SignalR+vue3聊天+WPF聊天

目录 一、.net6api接口 二、vue3前端 三、WPF客户端 此案例分为3部分。首先创建.net6api接口&#xff0c;然后使用前端vue3进行聊天&#xff0c;再使用wpf客户端进行聊天&#xff0c;并且互通聊天。 一、.net6api接口 1.首先建立一个能正常运行的api&#xff0c;然后增加Ch…

redis未授权访问漏洞的三种场景复现以及加固思路

1.redis简介 redis是一个 非常快速 的&#xff0c;开源的&#xff0c;支持网络&#xff0c;可以基于内存&#xff0c;也可以持久化的日志型&#xff0c; 非关系型 的键值对数据库。并提供了多种语言的api。有java&#xff0c;c/c,c#,php&#xff0c;JavaScript&#xff0c;per…