首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年7月15日 星期二 0:10am

请你说说进程、线程、纤程之间的区别?

  • 25-03-07 20:01
  • 3956
  • 10825
blog.csdn.net

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

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


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

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

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

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

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

纤程的优势:

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

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

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


什么是进程?

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

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

  1. // 线程:是操作系统资源调度的基本单位,cpu分配的基本单位
  2. public class T01_HelloFiber {
  3. public static void main(String[] args) throws InterruptedException {
  4. long start = System.currentTimeMillis();
  5. Runnable r = new Runnable() {
  6. @Override
  7. public void run() {
  8. calc();
  9. }
  10. };
  11. int size = 10000;
  12. Thread[] threads = new Thread[size];
  13. for (int i = 0; i < threads.length; i++) {
  14. threads[i] = new Thread(r);
  15. }
  16. for (int i = 0; i < threads.length; i++) {
  17. threads[i].start();
  18. }
  19. for (int i = 0; i < threads.length; i++) {
  20. threads[i].join();
  21. }
  22. long end = System.currentTimeMillis();
  23. System.out.println(end - start);
  24. }
  25. private static void calc() {
  26. int result = 0;
  27. for (int m = 0; m < 10000; m++) {
  28. for (int i = 0; i < 200; i++) {
  29. result += i;
  30. }
  31. }
  32. }
  33. }

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

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

  1. co.paralleluniverse
  2. quasar-core
  3. 0.7.6
  1. import co.paralleluniverse.fibers.Fiber;
  2. import co.paralleluniverse.fibers.SuspendExecution;
  3. import co.paralleluniverse.strands.SuspendableRunnable;
  4. import java.util.concurrent.ExecutionException;
  5. // 纤程:是用户态的线程,是线程中的线程,切换和调度不需要经过OS(操作系统)。;轻量级的线程 - 线程
  6. public class T02_HelloFiberV2 {
  7. public static void main(String[] args) throws InterruptedException, ExecutionException {
  8. long start = System.currentTimeMillis();
  9. int size = 10000;
  10. Fiber[] fibers = new Fiber[size];
  11. for (int i = 0; i < fibers.length; i++) {
  12. fibers[i] = new Fiber(new SuspendableRunnable() {
  13. @Override
  14. public void run() throws SuspendExecution, InterruptedException {
  15. calc();
  16. }
  17. });
  18. }
  19. for (int i = 0; i < fibers.length; i++) {
  20. fibers[i].start();
  21. }
  22. for (int i = 0; i < fibers.length; i++) {
  23. fibers[i].join();
  24. }
  25. long end = System.currentTimeMillis();
  26. System.out.println(end - start);
  27. }
  28. private static void calc() {
  29. int result = 0;
  30. for (int m = 0; m < 10000; m++) {
  31. for (int i = 0; i < 200; i++) {
  32. result += i;
  33. }
  34. }
  35. }
  36. }

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

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

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


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

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

 


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

                                           

       

 

注:本文转载自blog.csdn.net的不埋雷的探长的文章"https://blog.csdn.net/weixin_32265569/article/details/107574808"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top