Java多线程专题之线程与进程概述

多进程与多线程区别 在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一个执行线程), Java的Web容器Tomcat、Websphere等都是多线程的(每客户连接对应一个线程,所有线程都在一个进程中)。 从Unix发展历史看,伴随着Uni 阅读详情

前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个Java多线程专题长期系列教程,从入门到进阶,。

适合人群

  • 有一定的Java基础。
  • 想学习或了解多线程开发。
  • 想提高自己的同学。

背景

之前给大家讲了一些框架的使用,这些都属于业务层面的东西,你需要熟练掌握它并在项目中会运用它即可,但这些对自身技术的积累是远远不够的,如果你想要提高自己,对于语言本身你需要花更多的时间去挖掘而不是局限于框架的使用,所以之前为什么跟大家一直强调基础的重要性,框架可以千变万化,层出不穷,但是基础它是不变的,不管是学java还是前端或者是其它语言, 这一点大家还是需要认清的。

接下来的几期会专门讲多线程这一块,篇幅会较多,耐心看完你一定会有收获~

情景回顾

之前有给大家讲过Java的基础和进阶部分,如果这方面还薄弱的同学,可以到底部查看往期教程。那时本来想把多线程也出一些教程,但是可能对于大家会有点难度,特别是刚入门的同学,而且这方面的知识又比较多。或许平时项目开发,只是用用框架或者直接使用框架提供的一些多线程方法,很少会自己手写,即便这样,还是需要深入学习的,因为面试的时候,这个地方几乎是必问的,而且对于自身的提高还是有帮助的。

今天我们不涉及代码部分,先带着大家过一遍理论,一起来看一下什么是线程和进程 ~

什么是进程

在讲之前,先给大家讲一下,在早期,计算机是如何工作的。

在很早以前,计算机都是通过一个个指令去工作的,用户输入一个指令,计算机完成一个操作,这种效率是很低的。因为输入一个指令,计算机就等待。后来人们引入了批量处理,将一系列指令交给计算机处理,但是这个过程仍然是串行的,内部执行还是会阻塞。随着时间的发展,人们对于计算机的性能要求越来越高,因为时间就是金钱,如果能提高效率,老板当然高兴了~

后来,人们就提出了计算机进程的概念, 我们先看一下百科中是如何描述进程的:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体

这里,仍然不给大家提线程的概念,我们接着看进程。我们从中可以得到一个核心点,它是计算机系统资源分配和调度的基本单位。那么它又是怎么去分配和调度的呢?

上下文切换

当程序通过某种手段(编程语言编写)被编译为一系列指令和数据集合后,此时,CPU采用时间片轮转的方式运行进程。CPU为每个进程分配一个时间段,称作它的时间片。如果在时间片结束时进程还在运行,则暂停这个进程的运行,并且CPU分配给另一个进程(这个过程叫做上下文切换)。如果进程在时间片结束前阻塞或结束,则CPU立即进行切换,不用等待时间片用完。

当进程暂停时,它会保存当前进程的状态(进程标识,进程使用的资源等),在下一次切换回来时根据之前保存的状态进行恢复,接着继续执行。

使用进程和CPU时间片轮转方式,在宏观上看起来同一时间段执行多个任务,但在事实上,对于单核CPU来说,任意具体时刻都只有一个任务在占用CPU资源。

随着时间的推移,人们觉得这种方式还是有点效率低,不能够满足日常需求了。下面就是我们要讲的线程的概念了

什么是线程

我们知道进程在某一时刻只能处理一件事情,如果要处理其它的,只能等待前面的任务完成。于是呢,人们就提出了线程的概念。之前讲进程的概念的时候,其实还有一句话:

在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

从中可知,线程是存于进程之中,一个进程可以有多个线程,一个线程可以处理一个子任务,它是并发程序的基础。有的人可能问了,我多进程处理不也可以吗?使用多线程有什么优势?

首先我们需要知道的是处理一个程序不单单是执行任务,完了就结束了,往往我们的执行的任务之间是互相依赖的,也就是说任务之间需要交互,在这里叫进程通信或者线程通信。下面我们就说说这两者的比较

进程通信 & 线程通信

首先我们要知道进程和线程的本质区别,线程是进程的子集,一个进程可以有多个线程。从运行环境上可以得知,进程是独立的运行环境, 线程是进程下分配的一个子任务,也就是说进程独占系统资源和内存空间。这样一想,如果开启多个进程是比较消耗系统资源的。进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及调度,开销较大。线程只需要保存寄存器和栈信息,开销较小,所以这也是使用线程的优势。

进程与进程之间是互相隔离的,一个进程出现问题不会影响其它进程的运行,而线程崩溃是有可能影响整个程序的。另外一个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位。

上下文切换过程

这个概念非常重要,大家一定要好好去理解~

寄存器

上面提到寄存器,那么它是啥呢?它和上下文切换脱不开关系。上下文切换是指 CPU 从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某一时间点CPU寄存器和程序计数器的内容

寄存器是cpu内部的少量的速度很快的闪存,通常存储和访问计算过程的中间值提高计算机程序的运行速度。

程序计数器

程序计数器是一个专用的寄存器,用于表明指令序列中CPU,正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体实现依赖于特定的系统。

说的有点抽象,给大家举个例子。这里开启了两个线程A,B。那么线程A怎么切到B的呢?

  • 首先A线程挂起, 并将当前在cpu中的状态保存到内存中。
  • 在内存中检索下一个线程B的上下文并将其在CPU的寄存器中恢复,执行B线程。
  • 当B执行完,根据程序计数器中指向的位置恢复线程A。

过程分析

CPU通过为每个线程分配CPU时间片来实现多线程机制,CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态,所以任务从保存到再加载的过程就是一次上下文切换。

:star:️上下文切换通常是计算密集型的,意味着此操作会消耗大量的CPU时间, 如果你面试被问到Redis为什么采用单线程I/O多路复用模型,这个地方是不是可以拿出来讲一讲呢?

结束语

本期到这里就结束了, 总结一下,本节主要讲了什么是线程,什么是进程,以及上下文切换的概念。这些概念性的东西,大家不要去背,要自己去理解,不懂的地方可以自己再去搜索,一定要理解,然后自己多总结总结~

Java多进程多线程处理文件 Java提供了强大的多线程和多进程机制来处理文件,可以显著提高文件处理的性能。通过合理使用线程池和进程管理,开发者可以有效地利用系统资源,提高应用的响应速度和吞吐量。在设计多线程和多进程应用时,需要注意线程安全、资源管理和错误处理等关键问题。随着技术的发展,新的并发模型和工具不断涌现,为文件处理提供了更多的选择和可能性。ma。 阅读详情

相关推荐

Java多进程多线程处理详解

在Java编程中,多进程和多线程是两种常见的并发编程技术,用于提高程序的执行效率和响应速度。本文将详细介绍Java中的多进程和多线程处理,包括理论概述和代码示例。通过本文,你将了解如何在Java中实现多进程和多线程,以及它们在实际应用中的价值和意义。 一、理论概述 1. 多进程与多线程 多进程: 多进程是指操作系统中同时运...

Small world 653

进程与线程概述及JAVA多线程四种实现方式详解

1. 进程与线程概述 利用多线程技术可以使系统同时运行多个程序块,缩短出程序响应的时间,提高计算机资源的利用率,达到多任务处理的目的。 进程是程序的一次动态执行过程,每个进程都有自己独立的内存空间。一个应用程序可以同时启动多个进程(比如浏览器可以开多个窗口,每个窗口就是一个进程) 多进程操作系统能够运行多个进程,每个进程都能够循环利用所需要的CPU时间片,使的所有进程看上去像在同时运行一样。 线程是进程的一个执行流程,一个进程可以由多个线程组成,也就是一个进程可以同时运行多个不同的线程,每个线程完成不

weixin_48655626的博客 3806

Java讲课笔记33:多线程概述与线程创建

1. 了解多线程的概念 2. 掌握多线程创建的三种方式 3. 熟悉创建多线程三种方式的主要区别

howard2005的专栏 1299

Java中的多线程和多进程

Java中的多进程Thread创建进程线程状态进程的分类线程同步死锁 标准:高可用、高性能、高并发 区别 进程 线程 根本区别 作为资源分配的单位 调度和执行的单位 开销 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换开销大 同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器PC,线程的切换开销小 所处环境 OS中能同时运行多个任务/程序 同一...

木瓜有益健康的博客 3401

51单片机AHT20-21源代码

传感器输出经过 标定的数字信号,标准 I 2 C 格式。AHT20 配有一个全新设计的 ASIC专用芯片、一 个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其 性能已经大大提升甚至超出了前一代传感器的可靠性水平,新一代温湿度传感器, 经过改进使其在恶劣环境下的性能更稳定。但是现在网上的大多数原码都是针对stm32等的这种多位单片机,而我们都知道51单片机是8位单片机,无法对浮点数进行运算,对32位的整数计算有时候也不是很准确,所以我对网上stm32的例程进行了修改。...

wd0710的博客 4545

YOLOv13+SAHI实战:5步搞定无人机航拍小目标检测(附VisDrone数据集调参技巧)

本文详细介绍了如何结合YOLOv13与SAHI(切片辅助超推理)技术,在VisDrone2019数据集上实现高效的无人机航拍小目标检测。通过5个实战步骤,包括环境配置、SAHI参数解析、数据集调优、完整训练推理流程和性能优化技巧,帮助开发者显著提升小目标检测的准确率和效率。

egg99的博客 429

浅谈Python和Java的多进程与多线程的异同

最近在学习Python多线程相关的部分,遇到了这样的一句话:“对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行”,即Python中的多线程是“假的多线程”,是什么原因造成这样的说法,搜集查阅了一些资料,并且对比Java,如下是个人对于这个问题的一些理解: 解释型语言 编译性语言例如c语言:用c语言开发了程序后,需要通过编译器把程序编译成机器语言(即计算机识别的二进

Megustas_JJC的博客 9729

平衡电桥在高压绝缘检测中的动态切换策略与误差优化

本文深入探讨了平衡电桥在高压绝缘检测中的动态切换策略与误差优化方法。通过分析四种基本切换模式及智能切换时序设计,显著提升检测精度与范围。结合电阻选型黄金法则和软件补偿技术,有效降低测量误差,为电动汽车电池管理系统提供可靠的安全保障。

weixin_30275415的博客 471

多线程概述

多线程是Java语言的重要特性,大量应用于网络编程、服务器端程序的开发,最常见的UI界面底层原理、操作系统底层原理都大量使用了多线程。 我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程的应用。UI界面的主线程绘制界面,如果有一个耗时的操作发生则启动新的线程,完全不影响主线程的工作。当这个线程工作完毕后,再更新到主界面上。 我们可以上百人、上千人、上万人同时访问某个网站,其实,也是基于网站服务器的多线程原理,如果没有多线程,服务器处理速度会极大降低。 在学习多线程之前,我们先要了解几个关于多线

Du_XiaoNan的博客 1250

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

黑猫带你学Nand第11篇:万字长文带你了解NandFlash的数据保持原理及特性(Data Retention)

TATTAT:Trap-assistedtunneling,陷阱辅助隧穿,也有叫法称为电荷陷阱现象。这是一种物理现象,它发生在非挥发性存储器,如NAND闪存。在这种效应中,存储在闪存单元浮动栅极上的电荷(电子)由于隧道氧化物中捕获的电荷形成的电场影响,导致电荷通过隧道效应从一个能级隧穿到另一个能级,从而造成电荷泄漏。这种电荷泄漏是导致闪存数据保持问题的主要原因之一,因为它可以改变存储在闪存单元中的电荷量,进而改变其阈值电压水平,最终可能导致数据错误。在NANDFlash中,电荷被存储在浮置栅极上。

黑猫奥利奥的博客 1095

进程、线程与多线程概念详解

一、概述 在windows中,每一个打开运行的应用程序或后台程序,比如运行中的QQ、谷歌浏览器、网易云音乐、资源管理器等都是一个进程。我们感觉这些程序是“同时”运行的,但实际上,一个处理器同一时刻只能运行一个进程,只是CPU在高速轮换执行让我们有这样的错觉,我们感受不到中断的原因是CPU执行速度相对于我们的感觉实在是太快了。我们学c,写java,大部分时候做的都是单线程的编程。只有一条顺序执行的主

Leeon的博客 8530

从入门到精通!Arduino 全栈开发深度指南

本文围绕 Arduino 开发撰写全攻略,从基础入门到高级应用层层递进。开篇介绍 Arduino 概念、优势及硬件家族,引导读者完成开发环境搭建与首个 LED 闪烁项目;深入讲解编程语法、I/O 控制及通信协议;详细阐述传感器、模块应用与调试优化技巧;最后以自定义库开发、低功耗设计等高级内容收尾,并给出综合项目案例与产品化思路。无论新手入门,还是开发者进阶,均可从中系统学习 Arduino 知识,掌握从理论到实践的全流程开发技能。

邓邓子的博客 2754

Java多线程编程基础:进程与线程、并发与并行

理解进程与线程和并发与并行是Java多线程编程的基础。Java提供了多种创建线程的方式,开发者应根据具体需求选择最合适的方式。在多线程编程中,线程安全和资源管理是需要特别注意的问题。后续可以进一步学习线程同步、线程池等高级主题来提升多线程编程能力。希望这篇文章能帮助你更好地理解多线程编程基础中进程与线程和并发与并行的概念。如果你有任何问题或建议,欢迎在评论区留言讨论。

xOVOx___的博客 990

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8097

【Bug已解决】openclaw command not found / openclaw not installed — OpenClaw CLI 安装失败解决方案

安装 OpenClaw 后命令未找到或运行失败,本质是 PATH 未配置或 Python 版本不兼容。文中给出修复 PATH、使用虚拟环境、检查 Python 版本、pipx 安装等完整方案。

一键难忘的博客 8064

JAVA 多进程与多线程的概念

多进程     Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。一个JVM进程对应一个JAVA程序。一个java的应用程序对应于一个JVM实例,当一个java程序运行的时

evan_man的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

多线程多进程

进程(独立执行单元、资源分配的基本单位),线程(进程中的一个执行单元),进程上下文切换。进程间通信:文件、Socket通信、管道、消息队列;线程间通信:事件、条件变量、读写锁。进程创建:fork;线程创建:继承 Thread 类或实现 Runnable 接口。sleep()是Thread类的方法,不释放锁;wait() 是Object类的方法,会释放锁。

qq_53631388的博客 1120

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

多线程——进程与线程(详解)

在前一篇文章末尾我简单介绍了操作系统,在操作系统中有一个核心的概念就是进程,从本篇文章起,就开始JAVA语言多线程的讲解了,在此之前,本篇文章作为多线程的前序铺垫,一是介绍进程与线程的相关概念,二是区分进程与线程,三是解释为什么JAVA语言中不推荐使用多进程的方式进行编程而是更多使用多线程式编程。 我们现在所用的系统都是“多任务操作系统”,同一时刻,可以同时运行多个任务,这些正在运行的程序,就可以成为是“任务”,也叫做“进程”,进程包含了一个程序的所有状态信息。

HKJ_numb1的博客 1224

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

进程与线程+多线程优势

开始记录时间后创建了线程t1,然后开启t1,接着创建线程t2并开启该线程,然后就打印了执行时间,但此时两个线程还在执行任务,没有结束。线程用的就是进程启动时从操作系统中分配的资源,(线程也可以叫轻量级的进程),当创建一个进程时,进程中就会包含一个线程,叫主线程。run方法只是Java对象的一个普通方法,定义了线程要执行的任务,但是调用run方法不会申请系统进程PCB,不能启动线程。我们可以理解为进程就是一个公司,线程就是员工,一个公司可以有多个员工,一个进程可以创建多个线程。

欢迎来到 小哇 的博客,会一直加油! 1338

java多线程概述

转自http://www.kongzid.com/archives/thread2 , 1 线程:进程中负责程序执行的执行单元。线程本身依靠程序进行运行,线程是程序中的顺序控制流...

孔子说 1322

Java多线程开发(进程与线程)

Runnable接口无法在完成后获取一个返回值,所以出现Java.util.concurrent.Callable接口可以在线程完成后返回一个值。在方法介绍上,说明又时候我们并不一定都可以正常结束返回结果,这时就需要我们记得抛出异常。Thread类里面的start()方法实现多线程,于是我们就需要去观察Thread的。从上方代码我们可以看出由于没有继承Thread类,但是我们又必须要使用。将依次执行,但是在同一个时间点上只会有一个程序执行(单核),多核可。进程是在操作系统上的划分,线程是在进程上的划分。..

优快云博客 456

Java多线程之进程与线程

本文主要讲述线程与进程的概念区别与联系

2501_90345090的博客 840

多线程(一)程序,进程,线程的区别与联系

程序、进程、线程的概念 程序是指令的有序集合,被存储在磁盘或其他的数据存储设备中,是一个静态概念,其本身没有任何运行的含义。 进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统运行程序的基本单位,因此进程是动态的。 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 程序

qq_42856647的博客 5448
上一篇: 深入浅出JavaScript原型与原型链
下一篇: 详解Spring Boot中的JWT令牌管理策略
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值