【从入门到起飞】JavaSE—多线程(3)(线程池,最大并行数)

news2025/1/23 2:08:38

🎊专栏【JavaSE】
🍔喜欢的诗句:路漫漫其修远兮,吾将上下而求索。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰

文章目录

  • 🌺以前写多线程的弊端
  • 🎄线程池的主要核心原理
    • ⭐代码实现
      • 🛸创建线程池对象
      • 🎈第一种方法—没有上限的线程池
      • 🎈第二种方法—有上限的线程池
    • 🛸如何验证这个线程池是有上限的
      • 🛸方法一
      • 🛸方法二—使用debug来验证
  • 🍔最大并行数
  • 🏳️‍🌈线程池多大合适

线程池是一种用于管理和复用线程的机制,它可以提高多线程程序的性能和效率。线程池中包含一组预先创建的线程,这些线程可以被重复使用来执行任务,而不需要每次都创建新的线程。

使用线程池的好处有以下几点:

提高性能和效率:线程池可以避免频繁地创建和销毁线程,减少了线程创建的开销,同时可以有效利用系统资源,提高程序的整体性能和效率。
控制并发度:线程池可以限制并发执行的线程数量,防止系统资源被过度占用,避免线程过多导致的系统负荷过大和性能下降。
管理线程生命周期:线程池可以统一管理线程的生命周期,包括线程的创建、销毁以及异常处理等,简化了线程管理的复杂性。
提供任务队列:线程池通常包含一个任务队列,用于存储待执行的任务,可以按照一定的策略对任务进行调度和执行,保证任务的顺序性和稳定性。
在Java中,可以使用java.util.concurrent.Executors类来创建和管理线程池。常用的线程池类型包括:

FixedThreadPool:固定大小的线程池,可指定线程数量。
CachedThreadPool:可根据需要自动调整大小的线程池。
ScheduledThreadPool:用于执行定时任务的线程池。
SingleThreadExecutor:只包含单个线程的线程池。
使用线程池可以简化多线程编程,提高程序的性能和可维护性。但需要注意合理配置线程池的大小和参数,避免资源浪费或线程阻塞等问题
在这里插入图片描述

🌺以前写多线程的弊端

用到线程的时候就创建

class Mythread extends Thread{
		@override
		public void run(){
			多线程执行的一些代码
		}
}

用完之后线程消失

MyThread t1=new MyThread();
Mythread t2=new Mythread();

t1.start();
t2.start();

🎄线程池的主要核心原理

  1. 创建一个池子,池子里面的空的
  2. 提交任务时,池子会插件新的线程对象,任务执行完毕后,线程归还给池子,下次再次提交任务的时候,不需要创建新的线程,直接复用已有的线程即可
  3. 但是如果提交任务的时候,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

⭐代码实现

🛸创建线程池对象

Executors

实际上第一种是有上限的,是int类型的最大值,只是还没有创建这么大的线程池的时候,电脑先崩溃掉了
在这里插入图片描述

获取线程池对象
提交任务
销毁线程池

🎈第一种方法—没有上限的线程池

MyRunnable.java


public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i);
        }
    }
}

Test.java

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

public class Test {
    public static void main(String[] args) {
        //1.获取线程池对象
        ExecutorService pool1= Executors.newCachedThreadPool();
        //2.提交任务
        pool1.submit(new MyRunnable());
        //3.销毁线程池
        pool1.shutdown();
    }
}

在这里插入图片描述

🎈第二种方法—有上限的线程池

MyRunnable.java

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i);
        }
    }
}

Test.java

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

public class Test {
    public static void main(String[] args) {
        //1.获取线程池对象
        ExecutorService pool1= Executors.newFixedThreadPool(3);
        //2.提交任务
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());

        //3.销毁线程池
        //pool1.shutdown();
    }
}

🛸如何验证这个线程池是有上限的

🛸方法一

在这里插入图片描述
通过观察运行结果,发现虽然提交了6个任务,但是结果中的序号最多为1,这就表示线程池最多有3个线程

🛸方法二—使用debug来验证

在这里插入图片描述

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

再次点击下一步

在这里插入图片描述

再次点击下一步

再次点击下一步

再次点击下一步
在这里插入图片描述
再次点击下一步

发现现在池子里面的线程是3不变,但是有一个线程在等待

在这里插入图片描述

🍔最大并行数

如何得到电脑处理器的数量

public class Demo {
    public static void main(String[] args) {
        int count=Runtime.getRuntime().availableProcessors();
        System.out.println(count);
    }
}

在这里插入图片描述
得到结果为12,那么我们接下来操作的最大并行数就是12

🏳️‍🌈线程池多大合适

在这里插入图片描述

如果大家有不明白的地方,欢迎在评论区进行讨论

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

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

相关文章

NoSql非关系型数据库

前言&#xff1a;Nosql not only sql&#xff0c;意即“不仅仅是sql”&#xff0c;泛指非关系型数据库。这些类型的数据存储不需要固定的模式&#xff08;当然也有固定的模式&#xff09;&#xff0c;无需多余的操作就可以横向扩展。NoSql数据库中的数据是使用聚合模型来进行处…

幼教智能时代精英论坛北京举行

中国日报11月29日电 近日&#xff0c;智能时代赢之道—2023幼教智能时代精英论坛在北京泰山饭店成功举办&#xff0c;来自全国各地的近百位幼儿园园长、幼教老师集聚一堂&#xff0c;探索智能时代幼教的智慧化解决方案。 伴随“教育数字化战略行动”的深入开展&#xff0c;智慧…

97.STL-查找算法 find

目录 STL-查找算法find 1.基本用法&#xff1a; 2.查找自定义类型&#xff1a; 3.查找范围&#xff1a; STL-查找算法find 在C的STL&#xff08;标准模板库&#xff09;中&#xff0c;find 算法用于在指定范围内查找指定值的元素。 功能描述&#xff1a; 查找指定元素&…

【古月居《ros入门21讲》学习笔记】07_创建工作空间和功能包

目录 说明&#xff1a; 1. 工作空间(workspace) 结构&#xff1a; 2. 创建工作空间和功能包 创建工作空间 编译工作空间 创建功能包 设置环境变量 3. 注意 同一个工作空间下&#xff0c;不能存在同名的功能包&#xff1b; 不同工作空间下&#xff0c;可以存在同名的功…

BUUCTF-pwn-ciscn_2019_ne_51

简单查看保护&#xff1a; 32为程序没有canary没有PIE&#xff0c;应该是简单的栈溢出。我们照着这个思路去找溢出点在哪&#xff0c;运行下程序看看什么情况&#xff1a; 程序上来是输入一个密码验证。随便输入下错误直接退出。因此我们需要到IDA中看看怎么回事&#xff1a; 主…

华为OD机试 - 园区参观路径(Java JS Python C)

题目描述 园区某部门举办了Family Day,邀请员工及其家属参加; 将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角; 家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。 输入描述 第一行为园区的长和宽; 后…

简化企业调查:掌握企业基本信息API的实用技巧

引言 在当今数字化的商业环境中&#xff0c;企业的成功往往取决于对关键信息的迅速获取和准确分析。为了简化企业调查过程&#xff0c;许多组织已经开始采用先进的技术工具&#xff0c;其中企业基本信息API成为了一项强大而实用的资源。 如何使用企业基本信息API 查询方式灵…

Go语言实现大模型分词器tokenizer

文章目录 前言核心结构体定义构造函数文本初始处理组词构建词组索引训练数据编码解码打印状态信息运行效果总结 前言 大模型的tokenizer用于将原始文本输入转化为模型可处理的输入形式。tokenizer将文本分割成单词、子词或字符&#xff0c;并将其编码为数字表示。大模型的toke…

Windows 10和11的一个专用的设置菜单,让清理空间变得方便快捷

需要在Windows电脑上释放一些磁盘空间吗?Windows 10和Windows 11都提供了一个专用的设置菜单,使过程更容易。从该菜单中,你可以查看设备上使用了多少空间以及内容类型。 Windows中的“存储”设置还允许你快速清除空间,并启用“存储感知”自动删除临时文件和回收站项目。这…

uniapp 打包的 IOS打开白屏 uniapp打包页面空白

uniapp的路由跟vue一样,有hash模式和history模式, 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。 如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。…

小间距LED屏幕需要解决的五大芯片问题

随着微距LED电子显示屏的像素间距逐渐缩小&#xff0c;对封装技术提出了更高的要求&#xff0c;LED灯珠和芯片尺寸也需要进一步减小。由此引发的显示性能、产品品质、一次性通过率、亮度和灰度等问题都需要通过先进芯片技术来解决。那么&#xff0c;什么是微距LED显示屏&#x…

【Android知识笔记】架构专题(一)

什么是 MVC 其实我们日常开发中的Activity,Fragment和XML界面就相当于是一个MVC的架构模式,但往往Activity中需要处理绑定UI,用户交互,以及数据处理。 这种开发方式的缺点就是业务量复杂的时候一个Activity过于臃肿。但是页面结构不复杂的情况下使用这种方式就会显得很简…

C++基础 -16- 类的继承

类的继承格式 派生可以通过构造函数给基类的私有成员赋值 #include "iostream"using namespace std;class person {public:person(int a,int b):a(a),b(b){cout << "person-build" << endl;}protected:int a;int b; };class newperson:publi…

面试:说一下深拷贝,浅拷贝,引用拷贝吧;Object类中的clone是哪种呢?

目录 深拷贝、浅拷贝、引用拷贝Object类的clone()方法 深拷贝、浅拷贝、引用拷贝 ● 浅拷贝&#xff1a; 对基本数据类型进行值传递&#xff1b; 对引用类型&#xff0c;复制了一份引用类型的变量 里面存储的内存地址一样 指向的对象也一样。 ● 深拷贝&#xff1a;对基本数据…

轻量封装WebGPU渲染系统示例<39>- emissive和arm纹理支持(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/DynamicShaderBuilding2.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class DynamicShaderBuildi…

uniapp ios 授权弹窗 uniapp弹出框怎么实现

新版本的信息弹窗组件 可以弹出很多条信息&#xff0c;并单独控制消失时间、点击消失。 用循环来生成很多个弹窗&#xff0c;用this.$refs来传值&#xff0c;并添加数组。 1.布局 2.js 具体流程。需要一个弹窗&#xff0c;基本信息传入组件&#xff0c;处理后添加入数组&am…

Android关于杀掉进程的方案

《风波莫听穿林打叶声》—— 苏轼 〔宋代〕 三月七日&#xff0c;沙湖道中遇雨&#xff0c;雨具先去&#xff0c;同行皆狼狈&#xff0c;余独不觉。已而遂晴&#xff0c;故作此词。 莫听穿林打叶声&#xff0c;何妨吟啸且徐行。 竹杖芒鞋轻胜马&#xff0c;谁怕&#xff1f;一蓑…

“前端已死”?从ChatGPT与低代码平台看未来编程之路

每隔一段时间&#xff0c;“前端已死”的论调就会如潮水般重新涌现&#xff0c;引发行业内外的热议。这种论调背后&#xff0c;除了对于新技术&#xff0c;如ChatGPT、GPT-4对前端开发者影响的担忧&#xff0c;还反映了人们对于技术变革的焦虑。 作为前端开发者&#xff0c;我坚…

华清远见嵌入式学习——C++——作业2

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Rect { private:int width;int height;public:void init(int w,int h);void set_w(int w);void set_h(int h);void show(); };void Rect::init(int w,int h) {width w;height h;…