多线程是是我们程序设计中绕不开的问题,那么为什么多线程如此重要呢?因为这样做可以提高效率。其实多线程是整个世界运动的基本规律之一,多线程是绝对的,单线程是绝对的。例如在电影《红海行动-遇袭》中,蛟龙突击队的战斗过程完美展示了多线程从创建到最后结束的完整过程。这个故事的完整版在网上很容易找到视频 https://v.qq.com/x/page/d0643glx85w.html,本系列博客,我们将每个队员视为一个线程,通过该故事来描述如何使用多线程。如果这个场景我们完成了,多线程的用法也就基本掌握了。
在本故事中一共有8个人,详细介绍参考https://www.douban.com/note/662234090/姓名和职责如下:

姓名 职责
杨锐 队长
徐宏 副队长,爆破手
庄羽 通讯兵
陆琛 医护兵
佟莉 机枪手
张天德 机枪手
顾顺 狙击手
李懂 狙击观察手

从上面我们也可以看到每个人的职责是不一样的,公路遇袭包含包含好几个阶段,我们分别来看。

(1)创建过程
每个队员从加入这个队伍开始就已经是创建状态了,如果不符合要求,就需要提前为其准备资源条件,或者被换掉。例如电影开始的狙击手李星因为受伤而被顾顺顶替,其他人出任务之前准备枪支弹药,张天德因为怕疼还特意带了几颗糖,队友之间相互打气鼓励,队长了解战斗情况等都属于该过程。我们在设计多线程的时候,也要考虑是否需要设计为多线程,设计多少个线程,使用哪一种线程模式,每一个线程需要什么样的条件,需要给准备什么资源等。
(2)就绪过程
突击队在行军过程中一个飞弹打了过来,队长大喊“拍击炮”,之后各队员分别跳车躲避。随后队长大喊:“大家有没有事,快点回话”。这是为了掌握队员的情况,为接下来的安排做准备。如果有人受伤的话,队长会安排就近的人去救助。如果有人SW的话,会直接放弃。随后各个队员分别回复自己没事。我们通过一个表格来对比一下,你看这个过程是不是与多线程的创建和就绪过程非常类似呢?

红海行动情节 多线程就绪状态
飞弹打过来 程序启动
队长喊迫击炮 主线程启动
各队员跳车躲避 子线程创建
队长让回话 系统扫描子线程,确定数量,优先级等
队员分别回复没事 子线程进入就绪态

(3)执行过程
先来看队长的第一波指挥:“石头放手后方,佟莉侧翼攻击,陆琛把敌人阵地定位出来,徐宏把人质带出来,庄羽看一下还有什么装备能用”。收到命令后各个队员分别行动。徐宏在发现阵地后报告“迫击炮在车队两点钟方向”,此时庄羽找到了烟幕弹,推到容易被他人拿到的位置,自己则利用找到的ZS式旋翼无人机将炸弹飞到阵地上方爆炸,迫击炮攻击随之减弱,多个队员们利用短暂的空档期赶紧救人。当队长拿到烟幕弹之后喊“顾顺李懂快找制高点”。狙击手顾顺喊“收到,张天德(石头),掩护我”,随后石头火力压制顾顺李懂附近的敌人。但是针对太远,超过狙击枪的射程,所以在敌人退缩的瞬间,顾顺李懂赶紧靠近一辆车,但是火力太猛无法上车,只得在车下躲避。队长看到后喊“佟莉掩护我”,在佟莉掩护下,他带着烟幕弹到了容易攻击迫击炮阵地的位置发射了第一个弹药,然后喊“顾顺李懂,上”。随后两名狙击队员赶紧上车开向能狙击点。
就在此时,队长被狙击子弹击伤,于是对全员广播“对方有狙击手,所有人小心”,这意味着消灭对方狙击手和拔掉迫击炮阵地的任务一样重要。车子停稳之后顾顺说“我来解决迫击炮阵地,但是我一开枪,对方狙击手收一定会锁定我的位置,你尽快把他找出来,收到回复”。李懂“收到!”。之后在两个人的密切配合之下灭了迫击炮阵地,并击伤对方狙击手。
这段故事中,我们可以直观的感受到线程同步和线程通讯的重要作用。 在第一波指挥中,为什么队长不安排狙击手行动,而到了后面却努力配合他们开展行动呢?很显然是开始的时候不具备条件,贸然行动只会让狙击手丢掉性命。只有在定位清楚阵地,并且他们进入狙击枪射程之内才可以。同时我们也看到队友间相互喊话配合自己的行动,谁都不会贸然行动。多个线程在执行的时候也只会在具备足够条件后执行,而自己的执行又会给其他线程提供支持,这样渐进式的工作就是多线程系统的主要特征。
线程间如何进行同步?主要靠通讯,我们可以明显感觉到陆琛定位到阵地以及队长喊话有对方有狙击前后,我方队员行动的巨大转变,这都是通讯的重要意义。 线程之间也主要靠通讯来保证协同。在多线程系统中,对执行的时间没有具体要求,但是对执行顺序和执行条件有要求,这都要靠通讯来完成。
另外,顾顺喊话让找出对方狙击手位置时要求“收到回复”,为什么要回复而其他时候极少这么要求呢?这是因为狙击手是战场最难对付最危险的兵种。此时他们只能诱导对方开枪,这非常危险并且时间非常有限,错失良机很难弥补,所以一定要确保战友准确收到消息。这个和多线程工作场景很类似,有时候只要将消息广播出去就完了,但是有时候要求子线程必须在收到后给予响应。
(4)阻塞过程
当线程不具备执行条件时就会进入阻塞状态,在上面的描述中,队员发现自己无法执行下一步工作时会喊话队友帮忙,或者等待时机,而自己此时就是阻塞的状态。因此阻塞状态穿插在运行过程中,而不是一个独立的状态。
(5)结束状态
在上面故事中,解决迫击炮阵地,并击伤对方狙击手后,战斗就逐步进入结束状态了,所有人的注意力集中到救人上了,而此时队长发现一个炸弹马上就要爆炸了,所以立即喊话所有人,快跑,而徐宏在车底拆弹,出来慢,结果就被队长强行拖出来,随后炸弹连锁爆炸。
这个过程中,我们可以看到线程结束的两种方式,一种是完成任务后自行退出,另一种是被主线程强制退出。

上面的过程涉及多个多线程相关的内容。接下来,我们就分别从创建,同步,通讯,并发,线程池等多个方面来介绍多线程,同时根据红海行动的情节来设计Java版的遇袭。

透视Java多线程之一:多线程设计的使用相关推荐

  1. Java基础、多线程、JVM、集合八股文自述(持续更新)

    Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...

  2. java面试题 多线程_Java面试常见关于多线程的面试题

    多线程是Java技术中常用而且相对比较难易理解的一个知识点.而且多线程也是企业实际应用中必备的技术,因此在面试的过程中,面试者经常被问到关于多线程的问题,遇到这些问题大家应该怎么办呢?赶紧恶补一下Ja ...

  3. JAVA并发之多线程基础(5)

    上面介绍了并发编程中的栅栏等JAVA并发之多线程基础(4) .通过唯一的一个终点线来帮助确定线程是多晚开始执行下一次操作. LockSupport 提供了一个比较底层的线程挂起操作.有点类似于susp ...

  4. java厨房_Java多线程基础

    目录: 进程和线程 为什么使用多线程? 多线程的创建方式 Runnable与Thread两种方式比较 start()与run()方法 线程的生命周期/状态转换 常用方法使用与解读 线程的优先级 守护线 ...

  5. java中的多线程的示例

    在讨论多线程之前,让我们先讨论线程.线程是进程中轻量级的最小部分,可以与同一进程的其他部分(其他线程)并发运行.线程是独立的,因为它们都有独立的执行路径,这就是为什么如果一个线程中发生异常,它不会影响 ...

  6. kafka java 多线程_20. 多线程开发者实例

    # 多线程 Consumer Instance ## Kafka Java Consumer 设计原理 * Kafka Java Consumer 是单线程设计 * 从 Kafka V0.10.1.0 ...

  7. Java— 齐头并进完成任务—多线程

    感知多线程 Java是少数的几种支持"多线程"的语言之一.大多数的程序语言只能循序运行单独的一个程序块,无法同时运行不同的多个程序块.Java的"多线程"恰可弥 ...

  8. Java太密来福_这篇文章就是要让你入门java多线程【多线程入门】-Go语言中文社区...

    就在前几天,有位读者朋友私信宜春,说期待出一篇多线程的文章,我当时内心是小鹿乱撞啊-于是这几天茶不思饭不想,好几天深夜皆是辗转反侧,两目深凝,以至于这几天走起路来格外飘飘然,左摇右晃的,魔鬼般的步伐, ...

  9. 这篇文章就是要让你入门java多线程【多线程入门】

    就在前几天,有位读者朋友私信宜春,说期待出一篇多线程的文章,我当时内心是小鹿乱撞啊-于是这几天茶不思饭不想,好几天深夜皆是辗转反侧,两目深凝,以至于这几天走起路来格外飘飘然,左摇右晃的,魔鬼般的步伐, ...

  10. Java并发与多线程

    1.多线程优点 资源利用率更好:文件读写操作 程序设计在某些情况下更简单: 程序响应更快:端口监听操作 2.多线程的代价 设计更复杂:多线程共享数据时尤其需要注意 上下文切换的开销: CPU 会在一个 ...

最新文章

  1. 由 粗 到 精 学 习 LVI-SAM: imageProjection模块
  2. python pandas DataFrame 排序
  3. windows下使用开源gSOAP技术调用WebService
  4. centos7中每天定时备份mysql数据库
  5. Python--简单的端口扫描脚本
  6. 数据结构与算法--二叉树实现原理
  7. JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、代码下载量破700)
  8. Spring中IoC创建对象方式(构造器注入)
  9. python链表_手把手实现 python 的链表数据结构
  10. 电子元件 —— 继电器
  11. pxe dhcp offer之后没有_秒懂DHCP是什么
  12. 什么可以代替pencil?pencil代替品推荐
  13. html价格划掉的样式,用css布局价格划线_价钱中划线_价格中间贯穿删除线效果样式布局...
  14. 数字孪生应用白皮书(2020版)|PDF下载
  15. 2021软件测试面试题汇总【备战金九银十】内容较长建议收藏
  16. 重温JAVASCRIPT ES6
  17. 搭建Android开发环境Win7-64位
  18. 中国新媒体产业应用创新及市场规模预测报告2021-2027年
  19. 全球及中国工程担保行业项目规模分析与投资战略决策报告2022版
  20. R.E.管理器Root Explorer v2.21.1汉化版

热门文章

  1. 四元一次方程组用计算机怎么解,四元一次方程组
  2. 企业品牌建设的3个关键词:认知、联想、区别
  3. 林俊杰豪掷78万加入「元宇宙炒房团」!元宇宙资产有多贵:1548万买土地,414万买虚拟游艇...
  4. 画质增强概述-3.3-AI增强实践之服务形态
  5. python热力图分析_使用Python抓取腾讯宜出行热力图数据实战
  6. 想不想修真鸿蒙秘籍,想不想修真门派绝学一览 各门派秘籍汇总
  7. 计算机科学与技术对无人机,基于强化学习的无人机空中格斗算法研究-计算机科学与技术专业论文.docx...
  8. linux fsck
  9. JavaCV依赖精简(Java OpenCV依赖精简)
  10. 微商怎么通过美柚引流?粉丝必定是精准的宝妈粉