线程详细解析

news2025/1/24 5:35:57

本文重点:

目录

什么是线程?

线程共享和非共享资源

线程的优缺点

多线程

线程池

Java创建线程池


什么是线程?

线程是操作系统调度和执行的基本单位,线程和进程一样也有PCB

一个进程必定会有一个线程

在Linux内核中是不会区分进程和线程的,只在用户层面区分


线程共享和非共享资源

共享

文件描述符号

当一个文件被打开时,多个线程可以共享对该文件的读取和写入访问。

信号的处理方式

信号是一种用于通知进程发生了某种事件或异常的机制。信号的处理方式指的是进程如何处理接收到的信号

同一进程的内存空间

所有线程都共享同一进程的内存空间。

线程可以访问进程内的全局变量和静态变量。

动态的堆内存

通过mallocnew等动态内存分配函数分配的堆内存可以在线程之间共享,但需要谨慎管理以避免内存泄漏或竞争条件。

不共享

寄存器和栈空间

每个线程都有自己的寄存器和栈空间,用于保存线程的局部变量和函数调用信息。这些是线程私有的。

线程本地存储(Thread-Local Storage,TLS)

 每个线程可以拥有自己的线程本地存储,用于保存线程私有的数据,其他线程无法直接访问。

线程私有变量

每个线程可以有自己的私有变量,其他线程无法访问这些私有变量。

线程文件描述符表

每个线程可以有自己的文件描述符表,用于跟踪线程私有的文件打开和关闭操作。


线程的优缺点

线程的优点:

  1. 并发性(Concurrency): 线程允许程序在多个任务之间并发执行,提高了程序的响应性和性能。多线程程序可以同时执行多项任务,加快任务的执行速度。

  2. 资源共享: 线程在同一进程中共享相同的内存空间,因此可以轻松地共享数据和资源,不需要复杂的进程间通信机制。

  3. 轻量级: 相比于进程,线程更轻量级。线程的创建和销毁成本较低,因此可以更高效地管理多个任务。

  4. 响应性: 作为资源调度最小单位,多线程程序可以更快地响应外部事件和用户输入,提高了用户体验。

  5. 并行计算: 多线程可以利用多核处理器的并行计算能力,加速计算密集型任务的执行。

线程的缺点:

  1. 复杂性: 多线程程序可能会引入复杂性和难以调试的问题,如竞态条件(Race Condition)、死锁(Deadlock)、活锁(Livelock)等。

  2. 资源竞争: 多个线程共享相同的资源时,需要进行适当的同步操作,以避免竞争条件和数据不一致性问题。

  3. 内存消耗: 每个线程都需要一定的内存空间来存储线程的上下文和栈帧信息,多线程程序可能会占用较多的内存。

  4. 上下文切换: 线程之间的切换需要操作系统进行上下文切换,这会引入一定的开销。如果线程数量过多,上下文切换成本可能会超过性能提升。

  5. 难以调试: 多线程程序中的错误可能难以重现和调试,因为问题通常在特定的时机和条件下才会发生,而且每次错误还不一样

  6. 安全性问题: 多线程程序需要考虑线程安全问题,Java中如何正确地进行锁定和同步,避免数据损坏和不一致性。


多线程

每个线程是程序中独立的执行路径,可以并发执行不同的任务。

Java多线程编程是一种并发编程的方式,可以充分利用多核处理器的计算能力,提高程序的性能和响应性。

  1. 线程: 线程是操作系统能够进行调度的最小单位,它包含了程序计数器、栈、寄存器以及其他与执行状态相关的信息。每个线程都可以独立执行程序中的代码。
  2. 并发性: 多线程允许程序在多个任务之间并发执行,使得多个线程可以同时运行,互不干扰。
  3. 线程调度: 操作系统负责对线程进行调度,决定哪个线程在何时运行。线程调度是操作系统的核心功能之一,通常基于优先级、时间片轮转等策略进行。
  4. 线程同步: 多个线程同时访问共享资源时可能会导致竞态条件和数据不一致性问题。线程同步机制,如锁、信号量、互斥量等,用于确保多线程之间的正确协作。
  5. 线程通信: 多线程之间往往需要进行通信,以共享信息或协作完成任务。
    线程也可以复用一些进程的通信方法,如条件变量、管道、阻塞队列,共享内存等,用于线程之间的信息交换。在通讯方面更加容易
  6. 线程安全性: 线程安全是指多线程程序在多个线程并发执行时依然能够保持正确性和一致性。Java中有synchronized和notify以及volatile(内存可见性)
  7. 并行计算: 多线程可以利用多核处理器的并行计算能力,加速计算密集型任务的执行。
  8. 线程池: 线程池是一种管理和复用线程的机制,可以减少线程的创建和销毁开销,提高线程的利用率。
  9. 死锁: 多个线程相互等待对方释放资源,导致程序无法继续执行。

线程池

线程池(Thread Pool)是一种管理和复用线程的机制,它可以提高多线程应用程序的性能和资源利用率。

可以有效地控制线程的数量,避免线程的频繁创建和销毁,减少了线程管理的开销,提高了系统的稳定性和响应性。

  1. 线程复用: 线程池会创建一组线程,并将它们保持在池中,以备后续任务使用。避免了线程的频繁创建和销毁,提高了线程的重复利用率。

  2. 线程控制: 线程池可以控制并发线程的数量,限制了系统中活动线程的总数,防止线程数量过多导致资源耗尽或性能下降。

  3. 任务队列: 线程池通常使用任务队列来存储待执行的任务。线程池从任务队列中获取任务,并将其分配给空闲线程执行。一般会用到阻塞队列

  4. 线程管理: 线程池负责线程的生命周期管理,包括线程的创建、启动、暂停、恢复和终止。这减轻了开发人员的线程管理工作负担。

  5. 性能提升: 通过限制并发线程数量和复用线程,线程池可以提高多线程应用程序的性能,特别是在处理大量短时任务的情况下。

  6. 避免系统崩溃: 线程池可以限制系统中线程的数量,防止线程数量无限增长,从而避免系统因线程过多而崩溃。

创建线程池

导入包和创建实例

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


ExecutorService executor = Executors.newFixedThreadPool(5); // 例如,创建一个固定大小为5的线程池

使用execute()方法

executor.execute(new Runnable() {
    public void run() {
        // 任务的具体逻辑
    }
});

使用submit()方法

Future<?> future = executor.submit(new Callable<Void>() {
    public Void call() {
        // 任务的具体逻辑
        return null;
    }
});

executor.shutdown();//关闭释放资源


完整代码 

分配了十个任务,十个线程进行打印数据

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

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executor.execute(new Runnable() {
                public void run() {
                    System.out.println("Task " + taskId + " is executing.");
                }
            });
        }

        executor.shutdown();
    }
}


哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ


 

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

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

相关文章

新手询问想要成功学好嵌入式开发有什么建议吗?

今日话题&#xff0c;想要成功学好嵌入式开发有什么建议吗&#xff1f;想要学好的话选择一门合适的编程语言是关键。虽然嵌入式开发支持多种语言&#xff0c;但C和C仍然是最常用的。如果你是初学者&#xff0c;从学习C语言开始是一个不错的选择。它相对容易学习&#xff0c;而且…

基于Python开发的智能停车场车牌识别计费系统(源码+可执行程序+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的智能停车场车牌识别计费系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试…

教你制作作业查询系统

嗨&#xff0c;各位老师们&#xff0c;今天我要给你们介绍一个超级方便的工具——易查分&#xff01;你知道吗&#xff0c;利用易查分&#xff0c;我们可以轻松制作一个便捷高效的作业查询系统哦&#xff01; 是不是想有个自己的分班or成绩查询页面&#xff1f;博主给老师们争取…

​重生奇迹失落之塔三-四层刷怪攻略​

重生奇迹中的失落之塔一共是八层&#xff0c;每一层均需玩家达到相应的等级后方可进入&#xff0c;等级不到&#xff0c;谢绝入内&#xff0c;甚至有时即便你的等级达标&#xff0c;在里面刷一会怪之后&#xff0c;便自动地退去&#xff0c;因为这里面的怪物绝非等闲之辈&#…

再也不想去阿里巴巴面试了,6年测开面试遭到这样打击.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

智能新零售系统如何选择?连锁商超新零售POS解决方案优势?亿发

互联网的迅速发展&#xff0c;越来越多的实体门店发觉线上线上同步发展的“新零售“才是未来的大势所趋。那么智能新零售系统如何选择&#xff1f;新零售POS管理系统解决方案的优势有哪些? 一、智能新零售系统如何选择&#xff1f; 1、便于使用的基础数据排序功能 在新零售时…

VS报错 The build tools for v141 (Platform Toolset = ‘v141‘) cannot be found.

在配置OpenGL 项目的时候遇到了平台不一致的问题 错误 1 error MSB8020: The build tools for v141 (Platform Toolset v141) cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the current Vis…

java编辑pdf(itextpdf)

工作上遇到一个小需求&#xff0c;需要在原有的pdf文件上添加一行文字&#xff0c;实现方式如下 引入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependen…

qt 远程调试部署运行时出错-1: error: Deploy via rsync: failed to create remote directories:

1、按照《【正点原子】ATK-DLRK3568_Q开发环境搭建V*.pdf》搭建交叉编译环境、远程部署Qt应用程序后&#xff0c;点击qt-creator三角运行&#xff0c;提示“Deploy via rsync: failed to create remote directories:” 2、经查&#xff0c;文档中没有相关问题的提示解决&#…

关闭训练过程中的wandb

训练的过程中反复提醒wandb的账户&#xff0c;自动化执行的话&#xff0c;不是很方便&#xff0c;因此需要关闭这个wandb的功能 提醒的方式是这样的&#xff1a; 解决办法1、注释掉wandb相关的代码&#xff0c;并且添加关闭命令&#xff1a;wandb None 参考&#xff1a; 训…

探究Nginx应用场景

1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器&#xff0c;它可以用于托管静态资源。下面是一个简单的案例&#xff0c;展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名&#xff0c;并且你希望使用Nginx来托管位于/var/www/html目录下的静…

自定义权限指令与防止连点指令

1.权限指令 // 注册一个全局自定义权限指令 v-permission Vue.directive(permission, {inserted: function(el, binding, vnode) {const {value} binding; // 指令传的值// user:edit:phone,sysData:sampleconst permissions [user:edit:address, sysData:entrust, sysData:…

WebStorm使用Element组件库

文章目录 WebStorm使用Element组件库1. webstorm使用vue文件2. 首先需要安装Element Plus2. 项目完成引入-以日历为例 WebStorm使用Element组件库 1. webstorm使用vue文件 在Test.vue文件中书写模板,并暴露对外接口 <script> export default {name: "Test" }…

第1章_freeRTOS入门与工程实践之课程介绍

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

VS Code 安装方法

1.安装控制台程序.NET SDK 功能&#xff1a;应用能够正常的运行和构建。 .NET SDK下载地址&#xff1a;下载 .NET(Linux、macOS 和 Windows) 2.安装驱动编辑器vscode vscode下载地址&#xff1a;https://code.visualstudio.com/Download 选择System Installer&#xff0c;…

数据在内存中的存储——练习5

题目&#xff1a; 5.1 #include <stdio.h> unsigned char i 0; int main() {for(i 0;i<255;i){printf("hello world\n");}return 0; }5.2 #include <stdio.h> int main() {unsigned int i;for(i 9; i > 0; i--){printf("%u\n",i);}r…

MCU软核 2. Xilinx Artix7上运行tinyriscv

0. 环境 - ubuntu18 - win10 vivado 2018.3 - git desktop - XC7A35TV12核心板 - ft2232hl小板&#xff08;用于程序烧录&#xff09; 1. git克隆源码 Git Desktop -> File -> Clone repository -> -> URL: https://gitee.com/liangkangnan/tinyriscv/ -> Lo…

Vue3样式绑定

文章目录 Vue3样式绑定1. class 属性绑定1.1 v-bind:class 设置一个对象&#xff0c;从而动态的切换 class1.2 在对象中传入更多属性用来动态切换多个 class1.3 直接绑定数据里的一个对象1.4 绑定一个返回对象的计算属性。这是一个常用且强大的模式1. 5 数据语法1.6 errorClass…

Mental Poker- Part 2

在part-1中&#xff0c;我们梳理了去中心纸牌游戏所面临的挑战&#xff0c;也介绍了一种改进的Barnett-Smart协议&#xff0c;part-2将深入了解该协议背后涉及的算法。 Discrete-log VTMF VTMFs包含4部分&#xff1a;key generation, mask, remask and unmask&#xff0c;这些…

2024年java面试--mysql(4)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…