【Java多线程】对进程与线程的理解

简介: 【Java多线程】对进程与线程的理解

1、进程/任务(Process/Task)

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。


描述进程的是:PCB


组织进程的是:链表


2、进程控制块抽象(PCB Process Control Block)

进程是应用程序被调用时的一个状态,一个进程对应一个PCB,PCB是管理进程的,一个应用程序可以有多个进程。


2.1、PCB重要属性

PID,进程的标识符

内存指针,描述进程使用的内存、指令/代码、数据的位置

文件描述符表,进程使用的硬盘的相关信息

2.2、PCB中支持进程调度的一些属性

状态

       用于描述这个进程当前的状态,能够通过状态得知此时是否方便去cpu上执行。


       例如:当某个进程通过Scanner等待用户输入内容时,此时如果用户还未输入内容,该进程就已经去cpu上执行并等待接收用户输入了,如果用户一直不输入,该进程就会一直占用cpu,导致其他进程无法调用执行cpu。


       而有了状态描述,就可以避免让这种进程在还未能执行时的“堵塞状态”,不去占用cpu,等到方便执行时(即用户输入完成后),给出一个“就绪状态”,此时就证明可以该进程可以去cpu上执行。


优先级

       多个进程等待系统调度,这就需要有优先级。用于表示各个进程之间的优先级。


       例如:打游戏时,游戏和微信qq的优先级,想必也知道游戏的优先级更高。


记账信息

       统计每个进程占据cpu的时间,可以根据统计结果进一步调整调度的策略。


上下文

       PCB中的数据结构,支撑进程调度的重要属性,保存进程运行过程中的中间状态到内存中。通过上下文可以做到相当于游戏中的存档和读档操作。


3、 内存分配 —— 内存管理(Memory Manage)

核心结论:每个进程的内存是相互独立、互不干涉的。这是为了保证系统的稳定性,例如某个进程代码出现bug(内存读写越界),那么该bug只会影响自己,不会影响其他进程。


但是也有例外,虽然说进程之间相互独立,但是有的时候需要多个进程相互配合完成某个工作。


记忆:每个人的房子相互独立,但是公园都是大家的公共空间,这两者是不冲突的。


4、线程(Thread)

进程频繁的创建和销毁时,会有非常大的开销,主要体现在资源的申请和释放上。为了解决这一问题,就引入了【线程】这个概念,相当于细分了进程。


线程也可以称为“轻量级进程”,在进程的基础上做出了改进。


保持了独立调度执行,同时又省去了“申请资源”“释放资源”带来的额外开销。


5、进程和线程的总结

进程是包含线程的,每个进程至少有一个线程存在,即主线程。

进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间(所以资源开销少,但会影响其他线程)。

没有线程这个概念之前,进程是系统分配资源的最小单位,也是系统调度执行的最小单位。

有线程这个概念之后,进程是系统分配资源的最小单位,线程是系统调度执行的最小单位。

一个进程挂了一般不会影响到其他进程,但是一个线程挂了, 可能把同进程内的其他线程一起带走(整个进程崩溃)。


正因为线程之间共用同一块内存空间,因此某个线程出现bug时,可能会影响到其他线程。

如何正确处理这些问题,是使用线程的一个难点。


附上一个生动的理解图:


目录
相关文章
|
16天前
|
消息中间件 调度
如何区分进程、线程和协程?看这篇就够了!
本课程主要探讨操作系统中的进程、线程和协程的区别。进程是资源分配的基本单位,具有独立性和隔离性;线程是CPU调度的基本单位,轻量且共享资源,适合并发执行;协程更轻量,由程序自身调度,适合I/O密集型任务。通过学习这些概念,可以更好地理解和应用它们,以实现最优的性能和资源利用。
52 11
|
25天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
85 17
|
16天前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
32 6
|
1月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
21天前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
1月前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
1月前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
1月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
61 3
|
5月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
157 1
|
8月前
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
264 2