Java 多线程系列文章第 4 篇。
继续咱们的 Java 多线程系列文章,今天再讲讲概念,这篇应该是最后一篇基础概念,接下来就直接进入 Java 多线程主题了,在后面的文章里如果有概念需要单独拿出来讲时再补充概念篇。
这篇文章主要讲讲阻塞(Blocking)和非阻塞(Non-blocking)。
以前在学校做项目,基本上都是独立开发,每个人开发一个部分,以最小化沟通成本的方式划分工作量。到了职场,单纯的以最小化对接成本来安排工作是几乎不可能的,要考虑的因素变多了,各种跨小组、跨部门、甚至跨职场的工作,这就带来了沟通成本以及工作对接的各种阻塞问题。
新人刚入职场的时候,对一切都不熟悉,在做一些小组以外的对接工作时,就会遇到种种问题,特别现在充斥着各种分布式架构,以前开发 Web 后台的同学要会开发 JSP 页面,而现在前后端都分离了。设想一下这个场景。
小明是学习前端出身,刚开始步入职场,做的第一个需求就是登录和注册界面,需要对接一个写后台的同事小东,小东负责开发登录和注册的后台逻辑。小明开发了登录界面,准备和小东对接联调登录功能,这时小东回复说他刚好有生产 bug 在跟进,还没开发好,这时小明该怎么做?
有 2 种做法:
这 2 种做法的关键区别是什么呢?对于小东来说,没啥区别,他能做的就是尽量早点实现他的功能点。主要关注小明,第一种做法,小明做好了登录界面,接着则等待小东的登录后台接口,如果小东要开发一下午,那么小明就一下午啥事也不干,这种情况就是阻塞,小明的其他任务因为登录界面没对接联调,而一直阻塞着;第二种做法,小明得知小东登录后台接口还没实现,就着手先做注册界面的功能,然后每过一个小时跟小东确认一下登录后台接口开发是否开发完成,直到小东开发完登录后台接口,便开始对接联调,这种情况就是非阻塞,登录界面没对接联调完全不影响小明的开发进度,能联调的时候就联调,无法联调就完成手头上的其他任务。
可能有些同学初入职场会犯这类错误,做的功能依赖别人,因为别人还没做完,然后就采用第一种做法,一直干等着,直到对方完成后再继续工作。偶尔偷偷懒还行,如果一直是这样的工作状态,对初入职场的同学没有好处,而且这个被老板知道很不好。如果某一个需求点阻塞了,应该就先做手头上其他工作,如果手头上没其他工作,就跟老板反馈情况后领其他任务做,还要时刻去跟进阻塞的需求点的进度。
下面用流程图来描述这 2 个概念:
阻塞
非阻塞
看了上面的图,是不是更加理解阻塞与非阻塞了呢?
如果你是老板,或者说是小明的领导,你会让小明怎么做?第一种做法还是第二种做法呢?有支持第一种做法的,麻烦联系我,你们公司还招人么?