多线程篇八

news2024/11/17 6:56:48

多线程篇八

如笔者理解有误欢迎指正交流🌸🌸🌸


线程池
什么是线程池?

顾名思义,线程池是一个存放了很多线程的池子.既然有很多线程,那一定很方便调用对吧,有很多线程那大家一定喜欢一起玩吧(并发).

线程池是一种并发编程中常用的技术,用于管理和重用线程.
线程池由线程池管理器、工作队列和线程池中的线程构成.

线程池的优点

由于进程的频繁创建和销毁带来的巨大开销,所以聪明的大佬们选择引入线程池或者更轻量级的协程(纤程).
协程的本质室程序员再用户态代码中进行调度,不依赖内核.
纯用户态代码是基于线程封装过来的就比内核调用更加安全.
而引入线程池就能减少每次启动、销毁线程的损耗.【用完了也不用销毁,多次利用,喜欢用一辈子的奥特乐袋子!(bushi】

标准库中线程池

img
Tips

corePoolSize: 核心线程数(一个线程池里,最少有多少个线程)
maximumPoolSize :最大线程数(一个线程池中,最多有多少个线程)
keepAliveTime:线程空闲超过这个时间阈值,就会被销毁
unit:时间单位,取分钟,秒,小时等等
workQueue:和定时器相同,线程池也可以有很多任务,也可以设置为带有优先级的
ThreadFactory: 线程工厂,本质上是给new这个操作封装了一层,可能同名同参数的构造方法,这样构成不了重载,我们就想弥补一下这个缺陷,封装一层构造方法.

拒绝策略【重点】

一个线程池能容纳的任务数量有限,当持续添加任务的时候可能会超出上限,这时候拒绝策略就闪亮登场了.
img

1.直接抛出异常,新任务和旧任务都罢工.
2.新任务由添加它的线程自己执行.
3.丢弃任务队列中最老的任务
4.丢弃当前新加的任务

Excutors创建线程的几种方式

newFixedThreadPool:创建固定数目的线程池
newCacheThreadPool:创建线程数目动态增长的线程池(构造出的线程池对象都能动态适应 需要添加新任务时线程会根据需要自动被创建出来 并且可以在池中保留一段时间)
newSingleThreadExcutor:创建只包含单个线程的线程池
newScheduledThreadPool:设定延迟时间的执行命令/定期执行命令(进阶版的定时器)

线程池的实现

上代码!

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThreadPool {
    //用于保存线程,用于以后能取出线程并修改
    private List<Thread> ThreadList = new ArrayList<>();
    //用于保存任务的队列
    private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);

    //通过这个方法,把这个任务添加到线程池中.
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }

    //通过n指定创建多少个线程
    //创建了一个固定数量的线程池
    public ThreadPool(int n) {
        for(int i = 0; i < n; i++) {
            Thread t = new Thread(() -> {
                try {
                    //取出一个任务,并执行
                    Runnable runnable = queue.take();
                    runnable.run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            t.start();
            ThreadList.add(t);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadPool pool = new ThreadPool(4);
        for(int i = 0; i < 1000; i++) {
            int n = i;
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    //要执行的工作
                    System.out.println("执行任务 " + n + ", 当前线程为: " + Thread.currentThread().getId());
                }
            });
        }
    }
}

使用线程池需要设置线程的数目为多少合适?
一个线程执行的代码主要分为两类
1.CPU密集型(主要逻辑是算术运算/逻辑判断)
2.IO密集型(主要是进行IO操作)

假设一个代码的所有代码都还是CPU密集型的这时线程池的数量不应该超过N(N是极限)设置比N更大这个时候久无法提高效率了.在 CPU满的情况下无法提高效率此时增加线程反而增加更多的线程开销.
如果一个线程的所有代码是IO密集的,此时不用CPU,此时设置的线程数就可能超过N.较大的值可以用一个核心通过线程调用的方式并发执行.

正确的思路:线程池的线程数目与代码密切相关 所以通过实验的方式进行性能测试将代码修改成符合预期的状态

补充
对比线程和进程
线程的优点

1.创建出一个新的线程比创建一个新进程的代价小得多.
2.与进程之间切换相比,线程之间切换很少需要OS
3.线程占用的资源更少(相比进程
4.可以充分利用多处理器的可并行数量
5.在等待IO操作结束的时候执行其他的计算任务
6.计算密集型应用,将计算分解到多个线程中实现
7.I/O密集型应用为了提高性能将I/O操作重置线程可以等待不同的I/O操作

进程和线程的区别

1.进程是系统进行资源分配和调度的最小单位(独立的)线程数是最小的执行单位
2.进程有自己的内存空间,线程值独享指令执行的必要资源(比如寄存器和栈)
3.由于同一进程的各线程共享内存和文件资源,可以不通过内核直接俄通信.
4.线程的创建切换及终止效率高.

保证线程安全的思路

)线程数是最小的执行单位
2.进程有自己的内存空间,线程值独享指令执行的必要资源(比如寄存器和栈)
3.由于同一进程的各线程共享内存和文件资源,可以不通过内核直接俄通信.
4.线程的创建切换及终止效率高.


未完待续⭐⭐⭐

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

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

相关文章

【计算机网络】Tcp报文的组成,Tcp是如何实现可靠传输的?

Tcp的报文组成 TCP&#xff08;传输控制协议&#xff09;是计算机网络中一种重要的传输协议&#xff0c;其报文组成包括多个字段&#xff0c;每个字段具有特定的含义。以下是TCP报文头的主要组成部分&#xff1a; 源端口号&#xff08;Source Port&#xff09;&#xff1a;占用…

c语言中例题:打印出杨辉三角

杨辉三角是一个经典的数学模型 从顶部的单个1开始&#xff0c;下面每一行的数字都是其正上方的两个数之和 每行数字左右对称&#xff0c;且由1开始逐渐变大 1 1 1 1 2 1 1 3 3 1 由以上规律可以看出arr[i][j] arr[i-1][j] ar…

Android使用RecyclerView仿美团分类界面

RecyclerView目前来说对大家可能不陌生了。由于在公司的项目中&#xff0c;我们一直用的listview和gridview。某天产品设计仿照美团的分类界面设计了一个界面&#xff0c;我发现用gridview不能实现这样的效果&#xff0c;所以就想到了RecyclerView&#xff0c;确实是一个很好的…

对话总结:Scale AI的创始人兼CEO Alex Wang

AI的三大支柱 计算:主要由大公司如NVIDIA推动。算法:顶尖实验室如OpenAI主导。数据:Scale致力于推动数据进展。前沿数据的重要性 与人类智能相比较,前沿数据是AI发展的关键。互联网数据是机器与人类合作的结果。语言模型的发展 第一阶段:原始的Transformer论文和GPT的小规…

PHP爬虫淘宝商品SKU详细信息获取指南

在电子商务领域&#xff0c;获取商品的SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;详细信息对于商家进行库存管理、订单处理和客户服务至关重要。淘宝作为中国最大的电商平台之一&#xff0c;提供了丰富的API接口&#xff0c;使得开发者能够通过PHP爬虫…

AI在教育行业应用的启发和未来的方向

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 shelly已经给大家分享了很多AI的工具&#…

ThinkPHP一对多的关联模型运用

一、序言 最近在写ThinkPHP关联模型的时候一些用法总忘&#xff0c;我就想通过写博客的方式复习和整理下一些用法。 具体版本&#xff1a; topthink/framework&#xff1a;6.1.4topthink/think-orm&#xff1a;2.0.61 二、实例应用 1、一对多的关联 本文案例&#xff1a;一个用…

MySQL - 单表查询

DQL (数据查询语言)是用来查询数据库表中的记录的操作。在实际的业务系统中&#xff0c;查询操作的频率远远高于增删改。常见的查询操作包括条件查询、排序、分组等。 1. DQL 语法 SELECT 字段列表 FROM 表名列表 [WHERE 条件列表] [GROUP BY 分组字段] [HAVING 分组后条件]…

玩转图像处理:Python与OpenCV实现高效绿幕背景替换

文章目录 前言色度抠图技术&#xff08;Chroma Keying&#xff09;基本原理 数据准备代码实现性能分析代码优化优化后的速度 前言 现阶段绿幕抠图有很多种方式&#xff0c;比如色度抠图&#xff08;Chroma Keying&#xff09;、亮度抠图&#xff08;Luma Keying&#xff09;、色…

探索Python网络世界的利器:Requests-HTML库

文章目录 探索Python网络世界的利器&#xff1a;Requests-HTML库背景&#xff1a;为何选择Requests-HTML&#xff1f;什么是Requests-HTML&#xff1f;如何安装Requests-HTML&#xff1f;5个简单库函数的使用方法3个场景下库的使用示例常见Bug及解决方案总结 探索Python网络世界…

Acwing 质数

1.试除法判定质数 首先回顾一下什么是质数&#xff1f; 对所有大于1的自然数&#xff0c;如果这个数的约数只包含1和它本身&#xff0c;则这个数被称为质数或者素数 试除法&#xff1a;对于一个数n&#xff0c;从2枚举到n-1&#xff0c;若有数能够整除n&#xff0c;则说明除…

C# 泛型使用案例_C# 泛型使用整理

一、系统自带常用的泛型 1.字典&#xff0c;集合 //字典 Dictionary<string, int> dic new Dictionary<string, int>(); //泛型集合 List<int> list new List<int>(); 2.泛型委托&#xff0c;输入参数&#xff0c;输出参数 //泛型 委托---输出参…

nuclei配合burpsuite快速生成POC

nuclei配合burpsuite快速生成POC 简介 Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发&#xff0c;具有很强的可配置性、可扩展性和易用性 官网&#xff1a;https://nuclei.projectdiscovery.io Nuclei项目地址&#xff1a;https://github.com/…

生物信息常用编辑器:轻量/强大/可定制/跨平台支持的编辑器之神 - vim

Emacs 被誉为神的编辑器&#xff0c;而 vim 是编辑器之神。本人曾经是 Emacs 的粉丝&#xff0c;不过后来不知不觉&#xff0c;已经是 vim 的重度用户&#xff0c;而 Emacs 却很长时间没用了。 如果你开始在生物信息学中编写代码或处理大量文本数据&#xff0c;选择一个合适的文…

【C语言刷力扣】2079.给植物浇水

题目&#xff1a; 解题思路&#xff1a; 面对每一株植物有两种情况 水够 or 水不够&#xff1a; 水够&#xff1a; result 加1即向前走一步水不够&#xff1a; 走回河边再走回来并向前走一步&#xff0c;走到下一植物 result 2 * i 1 int wateringPlants(int* plants, int…

Cluster Explanation via Polyhedral Descriptions

通过多面体描述进行聚类解释 本文关注聚类描述问题&#xff0c;即在给定数据集及其聚类划分的情况下&#xff0c;解释这些聚类的任务。我们提出了一种新的聚类解释方法&#xff0c;通过在每个聚类周围构建一个多面体&#xff0c;同时最小化最终多面体的复杂性或用于描述的特征…

2024-9-28 QT登录框基础练习

1.头文件 #ifndef LOGINWINDOW_H #define LOGINWINDOW_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QVBoxLayout>class LoginWindow : public QWidget {Q_OBJECTpublic:// 构造函数LoginWindow(QWidget *parent nul…

卸载WSL(Ubuntu),卸载linux

禁用 WSL 功能 打开 Windows 功能&#xff1a; 按下 Windows R 打开运行对话框&#xff0c;输入 optionalfeatures&#xff0c;然后按回车。 禁用 WSL&#xff1a; 在弹出的 Windows 功能窗口中&#xff0c;找到 适用于 Linux 的 Windows 子系统&#xff08;Windows Subsystem…

2024年咸宁中级职称水平测试合格公示

工程系列水测合格549人 农业系列水测合格18人 新闻系列水测合格37人 档案系列水测合格16人 看来每年评工程类职称 人员还是占大多数 关于咸宁初级、中级职称评审更多需要了解的可以留言