本篇属于【Java多线程系列】文章第一章【基本概念与底层原理】的第一小节内容,我们会对串行、并行以及并发这几个基本概念进行介绍。
我们将以装修房子为例,需要完成三件任务,每件任务的完成花费一定的时间:
(1)墙体拆迁 -> 2天
(2)安装水电线 -> 1天
(3)粉刷、铺地板 -> 3天
串行
【定义】一次只能做一件事情,按照顺序依次执行,后面的代码段必须等到前面代码段的任务执行完毕后才能执行。
假设我们目前经费有限,只有一名工人,工人没有三头六臂,因此他需要一件接着一件来完成任务,只有完成一件任务后才能去完成下一件任务。
此时完成总体装修工程,一共需要花费2+1+3=6天的时间
并行
【定义】在同一时刻,多个任务可以同时开始进行,且彼此之间没有依赖关系
假设我们目前经费比较充足,雇佣了三名工人。装修工程的子任务之间没有依赖关系,因此工人们可以对墙体拆迁、安装水电线、粉刷铺地板这三件事情同时开工,每一名工人负责一件任务。
此时完成总体装修工程,总耗时取决于耗时最长的那件事情(在这里就是粉刷、铺地板)所需的时间,因此一共需要花费3天的时间
并发
【定义】以交替的方式利用等待某件事情完成的时间来做其他事情
假设我们目前经费不充足,只能雇佣了一名工人。仔细对粉刷、铺地板这件任务进行分析,发现它其实包含两部分,第一部分是进行粉刷墙壁、铺地板,第二部分是进行风干,分别花费2天和1天的时间。
粉刷、铺地板=粉刷墙壁、铺地板(2天)+ 风干(1天)
在等待房屋风干的时候,工人此时可以去完成其他的任务以节省时间
在第三天的时候,从宏观角度来看,工人同时做了两件事情,但是微观的角度来看,工人没有三头六臂,其实他只在进行安装水电线的工作。
此时完成总体装修工程,一共需要花费5天的时间
并发 vs 并行
根据CPU多路复用的原则,会将CPU的执行时间切分成很多细微的CPU时间片,一个CPU在同一时间只能完成一件任务。
对于单核CPU,当面对多个任务的时候,每个小时间片会执行一个操作,多个操作之间快速切换执行,造成了同时运行的假象。其实CPU在一个时间片内运行某一个线程时,其它线程处于挂起状态,这种方式我们称之为并发。
当系统有一个以上 CPU 时,则线程的操作可以并行开始。当一个 CPU 执行一个线程时,另一个 CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,他们同时进行,这种方式我们称之为并行。
文末福利
最近各大互联网公司的秋招都陆陆续续开始了,还在找工作的小伙伴可以后台**回复关键字进入对应的秋招/内推/面试群,我给大家整理了各大公司的内推通道、简历模板还有历年的笔试题**,大家要好好准备哦。还可以帮助大家**免费修改简历、模拟面试哦~**
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/21321751-89fbbf8c7c4f9e63?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/21321751-9e82ede818544bd3?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**关注公众号「程序员大帝」,《Offer收割机》系列持续更新~**
![在这里插入图片描述](https://upload-images.jianshu.io/upload_images/21321751-2559bb455a50a0db?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!