| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 简述进程、线程、协程 -> 正文阅读 |
|
[Java知识库]简述进程、线程、协程 |
?今天和boss闲聊,提到了进程和线程,boss问我进程和线程什么关系,我心想这不so easy,一个程序就相当于一个进程,进程可以有很多线程,巴拉巴拉。。。boss又问道,“那协程呢?”。我:“携程?”,boss于是从头至尾跟我讲了一遍这三者的关系,这篇博客就来整理总结一下。 1 进程进程就是一个在内存中运行的应用程序,进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的一块内存空间用来拥有代码、打开的文件资源、数据资源,比如在Windows系统中,一个运行的xx.exe就是一个进程。下面是最熟悉不过的任务管理器: 图中的每一个应用,每一个后台进程,都是一个进程。 ?进程有五种状态:创建、就绪、阻塞、运行、关闭,转换关系如下: ?2 线程线程是进程中的一个最小的执行任务(执行单元或控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。与进程不同的是同类的多个线程共享进程(所拥有的全部资源)的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 Java 程序天生就是多线程程序,我们可以通过 JMX 来看一下一个普通的 Java 程序有哪些线程,代码如下:
上述程序输出如下(输出内容可能不同,最重要的是main 线程执行 main 方法):
从上面的输出内容可以看出:一个 Java 程序的运行是 main 线程和多个其他线程同时运行。
线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。 从 JVM 角度说进程和线程之间的关系(重要) Java 内存区域: 从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈,也就是说程序计数器、虚拟机栈、本地方法栈都是线程私有的:
多进程和多线程区别 多进程:操作系统中同时运行的多个程序 多线程:在同一个进程中同时运行的多个任务 比如多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。 多线程提高CPU使用率 多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。 Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程。 3 协程协程(Coroutines)是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。它就是一个函数,一个特殊的函数——可以在某个地方挂起,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。 一个线程内的多个协程的运行一定是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。协程本质就是一个函数。一个线程内可以运行多个函数,但是这些函数都是串行运行的。当一个协程运行时,其他协程必须挂起。协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。协程与进程、线程相比不是一个维度的概念
?而协程能比较好地处理这个问题,当一个协程(特殊子进程)阻塞时,它可以切换到其他没有阻塞的协程上去继续执行,这样就能得到比较高的效率: ?上面举的例子是5个I/O处理,可见I/O阻塞时,利用协程来处理,切换效率比较高。但假设每秒500、50000、5000000个I/O呢?已经达到了“I/O密集型”的程度,因为协程没有利用多核的能力,这种情况协程将无能为力,需要使用“多进程+协程”。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 9:01:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |