Java多线程基础-3:进程与线程间的区别的联系

简介: 进程是操作系统中运行的应用程序,具有独立内存空间,包含代码、数据和堆栈,是资源分配的最小单位,而线程是CPU调度的最小单位,是进程内的执行任务,多个线程可共享进程资源。

一、进程与线程


1、进程


  • 进程是一个正在内存中运行的应用程序。


  • 在Windows系统中,一个正在运行的xx.exe文件就是一个进程。(注意:没有正在运行的.exe不是进程。)它是操作系统中一个非常基础的概念,对于理解计算机系统的运行机制非常重要。


  • 每个进程都有自己独立的内存空间,包含了程序代码、数据和堆栈等。


  • 每个进程中包含一个或多个线程,至少也会有一个线程。


  • 在操作系统中,进程是一个重要的概念。它允许多个程序同时运行,实现了多任务处理的能力。


  • 可以把进程看作是操作系统对一个正在运行的程序的抽象。进程的核心属性包括:PID,文件描述符表,内存指针,优先级,上下文,状态等,这些属性标识了系统对进程的资源分配:每个进程拥有自己独立的资源,如内存、文件、设备、CPU时间片等,同时也有自己的状态,如运行、就绪、阻塞等。每创建一个新的进程,就要向操作系统申请新的一整套的资源。操作系统通过管理进程来实现对计算机资源的调度和分配。因此,进程是资源分配的最小单位。


  • 进程可以通过创建子进程、进程间通信等方式实现复杂的任务,例如并发处理、网络通信等。


  • 进程可以由操作系统启动或由其他进程创建,它们可以在同一台计算机上运行,也可以在不同的计算机上运行。


  • 操作系统负责对进程进行调度,根据进程的状态和优先级分配给它们相应的时间片,使得它们可以轮流运行,从而实现多任务处理。


任务管理器中查看当前进程


2、线程


  • 线程是进程中的一个执行任务(控制单元),它是计算机程序执行时的最小单位,或者说,线程是CPU调度的最小单位。


  • 一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。


  • 每个线程都有自己的执行序列和状态。多个线程可以在同一时间内并发执行,从而提高程序的效率和响应速度。


  • 线程共享进程的内存空间,因此可以访问相同的变量和数据结构。


  • 但是,由于多个线程可以同时访问共享资源,如果没有采取适当的同步措施,就会出现数据竞争和其他并发问题。


  • 线程可以在同一进程内协同工作,共同完成任务。例如,一个线程可以负责读取数据,另一个线程可以负责对数据进行处理,第三个线程可以负责将处理结果写入文件。


  • 多线程的方式可以充分利用计算机的硬件资源,提高效率。但是,线程的创建、切换和销毁等操作都需要消耗一定的系统资源,因此过多的线程反而会导致系统性能下降。因此,在编写多线程程序时需要注意平衡线程数量和系统资源的利用率。


关于“线程共享内存空间,因此可以访问相同的变量”这一结论,可以用以下方式来验证:




在main线程中创建的局部变量a,在 t 线程中也能访问到。


这里涉及到变量捕获的问题。变量捕获本质上是复制变量,可能从本线程复制而来,也可能从其它线程复制而来。但如果是从其它线程复制过来,那前提一定是能访问到另一个线程的内存(既然复制,前提一定是你能够拿到那个线程里面的变量)。


二、进程与线程之间的区别和联系


1、区别


进程和线程都是计算机操作系统中的概念,它们都代表着正在执行的代码。


它们之间的主要区别是:


  1. 进程是操作系统资源分配的最小单位,而线程是CPU调度的最小单位(或者说是进程中执行的最小单位)。


  1. 每个进程都有自己的地址空间、代码、数据和打开的文件等资源,进程之间相对独立,每个进程都有自己的独立空间和状态。而同一线程中的多个线程彼此共享该进程的资源。


  1. 进程切换的开销比线程大,因为每进行一次进程的切换,就同时需要切换地址空间和上下文环境。可以理解为,由于进程之间相对独立,每创建一个进程,就需要重新申请一块相应的资源。而线程切换只需要保存和恢复一部分上下文。


  1. 进程之间可以通过进程间通信来交换信息,而线程之间可以通过共享内存、消息队列等方式交换信息。


  1. 在实际编程中,线程可以更高效地利用多核处理器,提高系统的并发能力和响应速度,而进程更适合用于实现不同的功能模块以及隔离不同的应用程序的情境下。


2、联系


进程和线程之间也有联系,它们的关系如下:


  1. 一个进程可以包含多个线程。这些线程共享进程的地址空间和资源,因此它们可以相互通信和协作。


  1. 在多线程编程中,一个进程可以同时执行多个线程,这些线程可以并发地执行不同的任务,提高系统的并发能力和响应速度。


  1. 线程之间可以通过共享内存等方式共享数据和信息,从而实现协作和同步。


  1. 进程之间也可以通过进程间通信的方式共享数据和信息,从而实现协作和同步。


  1. 进程和线程的设计和实现都需要考虑资源的分配和管理、同步和互斥等问题,因此它们之间也有类似的编程模型和技术。


通过 jconsole 工具,可以直观地观察到“进程包含线程”这一结论:






相关文章
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
5月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
225 0
|
5月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
423 16
|
6月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
6月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
7月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
7月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
406 83
|
7月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
339 0