线程和进程概念区别—及线程常用方法和状态

简介: 进程和线程是操作系统中的两个基本概念。进程是程序执行的基本单位,每个进程都有自己独立的内存空间和系统资源,它拥有自己的虚拟地址空间、代码段、数据段、堆栈段等。一个程序可以对应多个进程,每个进程之间是独立运行的,互相之间不会影响。

线程和进程的区别


进程和线程是操作系统中的两个基本概念。


进程是程序执行的基本单位,每个进程都有自己独立的内存空间和系统资源,它拥有自己的虚拟地址空间、代码段、数据段、堆栈段等。一个程序可以对应多个进程,每个进程之间是独立运行的,互相之间不会影响。


线程是在进程内部执行的一个单一顺序流,它是比进程更小的执行单位。一个进程可以创建多个线程,在同一时间内运行多个线程可以提高执行效率。线程共享所属进程的代码段、数据段和系统资源,但每个线程却有自己独立的运行栈和栈指针寄存器。


所以说,线程必须依赖于进程而存在,并且不能脱离进程而独立存在。在这种关系下,一个进程可以包含多个线程,这些线程共享同一份内存资源,并协同完成任务。同时多个线程之间也需要进行协作与同步,以避免不必要的竞争和冲突。


总而言之,一个进程可以包含多个共享同一资源的并发执行路径即线程。通过合理地利用多线技术可以有效地提高程序性能和响应速度。


终止线程


应该怎么终止一个线程呢?


1.当线程完成任务时。


2.通过使用变量来控制run方法退出的方式停止线程,即通知方式。


这里详细介绍一下2的方式。


在A线程依靠变量循环跑的过程ing,主线程通过修改A线程的变量,来控制线程终止。


为A线程中的变量设置set方法,来修改掉循环条件,从而让run方法走向结束。


所以在A线程想要B线程退出怎么办呢?


在A线程中通知B线程,控制B线程的变量,通知它退出即可。



线程常用方法


设置名称


get,setName


设置优先级


get,setPriority


中断线程


interrupt(不会真正结束线程,所以一般用于中断正在休眠线程)


调用线程


start,run


线程礼让


yield静态方法(让出CPU,让其他线程执行,不一定礼让成功)


线程插队


join(一旦A线程插队成功,则先执行完A线程所有,再继续执行B线程剩下的,相当于阻塞B线程)



线程守护


1.用户线程(工作线程):普通线程


2.守护线程:所有用户线程结束,守护线程自动退出(GC机制)


怎么把一个普通线程变成守护线程?


线程名称.setDaemon(true);


先设置完守护线程,再start方法启动。



线程的7个状态


111.png

(此图源于韩顺平老师B站课程)



线程同步机制


在多线程编程中,有一些敏感数据不应该被多个线程同时访问,此时应该使用同步访问技术,保证数据在任何时刻,最多只能有一个线程访问,保证数据的完整性。


同步具体方法:Synchronized(也可以称之为互斥锁)


非静态同步方法的锁对象默认是this,也可以是其他对象(要求是同个对象)。


静态同步方法的锁对象默认为当前类.class。


步骤


1.分析需要上锁代码


2.选择同步代码块或同步方法(尽量为同步代码块,范围小,效率高)


3.要求多个线程锁的对象为同一个即可!


线程死锁


线程之间都占用了对象的锁资源,需要互相返回值才肯相让,才导致了死锁。


举个栗子:


两个人打架。

小明:你先松开手,我再松开

我:你先松开手,我才松开


b17ec817750e1c1da9a5a8417e3d7b23.png

222.png

33.png

(此图源于韩顺平老师B站课程)



释放锁


以下操作会释放锁:


当前线程的同步方法,同步代码块执行完毕

当前线程的同步方法,同步代码块遇到break,return

当前线程的同步方法,同步代码块出现异常

当前线程的同步方法,同步代码块执行线程对象的wait方法,当前线程暂停,并释放锁


以下操作不会释放锁:


调用Thread.sleep方法,Thread.yield方法暂停当前线程的执行(休眠多久,外面的线程就会等多久)

其他线程调用了该线程的suspend方法将该线程挂起(suspend和resume方法已被废弃)

目录
相关文章
|
5天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
10天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
7天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
17 1
|
12天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
27 2
|
14天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
21天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
23 1
|
22天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
16 2
|
22天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
15 1
|
22天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
28 1