其他链接:JAVA相关的深度技术博客链接

相信很多小伙伴们在面试的时候,面试官都会提这样的一个问题。


请你说说什么是进程,什么是线程,两者有什么区别?

很多小伙伴可能会直接说,进程就是一个个后台程序,线程是在进程中创建出来的。这种回答也没什么毛病,粗略的来说是对的,就是相对不够专业。

首先,我们得了解计算机底层层面是逻辑图,然后再深刻理解:进程、线程、纤程

按上面计算机底层逻辑,我们可以这样回答,就非常专业了,也是面试官想要的答案:

  • 进程:是操作系统资源分配的基本单位,比如内存、打开文件、网络IO,分配了独立的内存空间
  • 线程:是操作系统资源调度的基本单位,cpu分配的基本单位
  • 纤程:是用户态的线程,是线程中的线程,切换和调度不需要经过OS(操作系统)。;轻量级的线程 - 线程

纤程的优势:

  1. 占有的资源少,为什么说他占有资源少呢?举例:操作系统要启一个线程前后要为这个线程配的内存数据大概有1M,而纤程大概是4K
  2. 由于纤程非常的轻量级,所以切换比较简单
  3. 可以同时被启动很多个(10万个都没问题)

目前支持内置纤程的语言Kotlin Scala Go 等,可惜的是,Java没有官方的纤程支持,好在有个叫做Quasar的库可堪一用

下面我就举个例子来证明一下,进程、线程、以及 纤程先对于线程来说的优势,有兴趣的小伙伴可以试试


什么是进程?

// 进程:是操作系统资源分配的基本单位,比如内存、打开文件、网络IO,分配了独立的内存空间
public class T00_Process {public static void main(String[] args) {System.out.println("hello world");}
}

什么是线程,及与纤程计算对比

// 线程:是操作系统资源调度的基本单位,cpu分配的基本单位
public class T01_HelloFiber {public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();Runnable r = new Runnable() {@Overridepublic void run() {calc();}};int size = 10000;Thread[] threads = new Thread[size];for (int i = 0; i < threads.length; i++) {threads[i] = new Thread(r);}for (int i = 0; i < threads.length; i++) {threads[i].start();}for (int i = 0; i < threads.length; i++) {threads[i].join();}long end = System.currentTimeMillis();System.out.println(end - start);}private static void calc() {int result = 0;for (int m = 0; m < 10000; m++) {for (int i = 0; i < 200; i++) {result += i;}}}
}

什么是纤程,及与线程计算对比

首先像前面说的那样,java 原生没有提供纤程支持,需要依赖于 Quasar的库,所以需要将依赖包,通过pom.xml导入到本地仓库

<!-- https://mvnrepository.com/artifact/co.paralleluniverse/quasar-core -->
<dependency><groupId>co.paralleluniverse</groupId><artifactId>quasar-core</artifactId><version>0.7.6</version>
</dependency>

import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.strands.SuspendableRunnable;import java.util.concurrent.ExecutionException;// 纤程:是用户态的线程,是线程中的线程,切换和调度不需要经过OS(操作系统)。;轻量级的线程 - 线程
public class T02_HelloFiberV2 {public static void main(String[] args) throws InterruptedException, ExecutionException {long start = System.currentTimeMillis();int size = 10000;Fiber<Void>[] fibers = new Fiber[size];for (int i = 0; i < fibers.length; i++) {fibers[i] = new Fiber<Void>(new SuspendableRunnable() {@Overridepublic void run() throws SuspendExecution, InterruptedException {calc();}});}for (int i = 0; i < fibers.length; i++) {fibers[i].start();}for (int i = 0; i < fibers.length; i++) {fibers[i].join();}long end = System.currentTimeMillis();System.out.println(end - start);}private static void calc() {int result = 0;for (int m = 0; m < 10000; m++) {for (int i = 0; i < 200; i++) {result += i;}}}
}

多线程与多纤程计算耗时对比结果如下:

有兴趣的小伙伴可以把代码copy下去自己试一试,当启动的线程数量和纤程数量越大的时候,体现纤程优势的效果越明显。

最后说一下纤程的应用场景:纤程 vs 线程池:很短的计算任务,不需要和内核打交道,并发量高!


文章最后,给大家推荐一些受欢迎的技术博客链接

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

请你说说进程、线程、纤程之间的区别?相关推荐

  1. python协程和线程_线程和协程之间的区别

    线程和协程之间的区别很大,甚至大过进程和线程之间的区别.线程建立在进程之上,协程建立在线程之上.那么协程是什么呢? 协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复.协程非常适 ...

  2. 进程、线程和协程之间的区别和联系

    文章目录 一.进程 二.线程 三.进程和线程的区别与联系 四.一个形象的例子解释进程和线程的区别 五.进程/线程之间的亲缘性 六.协程 一.进程   进程,直观点说,保存在硬盘上的程序运行以后,会在内 ...

  3. java协程和线程_Kotlin中的线程和协程之间的区别

    由于我仅在JVM上使用协程,因此我将讨论JVM后端,也有Kotlin本机和Kotlin JavaScript,但是这些Kotlin后端不在我的讨论范围之内. 因此,让我们开始将Kotlin协程与其他语 ...

  4. kotlin 子线程睡3秒_Kotlin中线程和协程之间的区别

    Ruslan.. 47 由于我只在JVM上使用协同程序,我将讨论JVM后端,还有Kotlin Native和Kotlin JavaScript,但Kotlin的这些后端超出了我的范围. 让我们首先将K ...

  5. 【进程线程】1. 概念和区别

    进程和线程--1. 概念与区别 一.概念 1. 进程 进程本质上是正在执行的一个程序,是对运行时程序的封装,每个进程会具备一个地址空间,在该空间内可以进行读写.该地址空间中存放可执行程序.程序的数据. ...

  6. python 协程、进程、线程_Python进程、线程、协程之间的关系

    一.从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 . 1.进程: 表示一个程序的执行活动 (打开程序.读写程序数据.关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 ...

  7. 父亲儿子女儿放取水果进程/线程间通信程序设计与实现

    父亲儿子女儿放取水果进程/线程间通信程序设计与实现 代码: #include<unistd.h> #include<stdio.h> #include<pthread.h ...

  8. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

  9. handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...

    转载:https://blog.csdn.net/shaoenxiao/article/details/54561753 今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间.子线程与主线 ...

最新文章

  1. shell编程 字符串处理
  2. mongodb 部署
  3. 机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构
  4. idea中git如何切换到master_IDEA中Git的使用
  5. rss spring 接口_spring mvc: rss(xml)输出
  6. hibernate不能保存时分秒处理
  7. 微信公众号自动发布文章
  8. 网络电视机顶盒测试软件,调试接口查找方法,机顶盒刷成全网通盒子,实现免费看电视...
  9. 安卓学习pdf_【手机电脑全平台通用】手把手教你制作可点读日语PDF!
  10. 18650锂电池保护板接线图_单节18650锂电池保护板的电路原理图
  11. mysql 周平均值_SQL语句: 按周、月统计总值 和 平均值
  12. windowsGHO镜像系统winXPwin7win8win10正版下载
  13. 如何打开.exe文件
  14. 警告提示:Capturing ‘self‘ strongly in this block is likely to lead to a retain cycle
  15. QQ查询信息php,查询QQ信息
  16. 15个顶级Python库,你必须要试试!
  17. java小时钟实验报告_JAVA实验报告(运用JavaFx实现时钟动画).doc
  18. C++笔试笔记1(4399 西山居 深信服 剑心互娱 快手)
  19. NO.1——VulnHub-GoldenEye-1-Walkthrough
  20. 五笔字型词组输入规则(口诀:打词方法)

热门文章

  1. DSPE-PEG-AEYLR,磷脂-聚乙二醇-小肽修饰脂质体,DSPE-PEG2000-AEYLR
  2. PHP初级【10天小积累-第九天】
  3. 3D渲染软件综合介绍
  4. idea操作redis
  5. 正定矩阵、负定矩阵、半正定矩阵、半负定矩阵
  6. 【Kotlin】学习小记-基础篇
  7. java万年历解析,java万年历
  8. MySql.Data.dll 适配.NET 4.0的版本免费下载) 网上找了很久都是要收费的,最后github下载的,链接如下: https://github.com/BingFengHung/MyS
  9. 自学鸿蒙应用开发(3)- 你好,鸿蒙!
  10. 车载诊断数据库ODX——ODX参数解析类型(下)