恋爱中的Java多线程:从单身到共舞的浪漫指南(一)

news/2024/5/20 6:35:39

引言:孤独的线程,寂寞的码农

第一章:《初遇:单线程的孤独星球》

  • 单线程的独白

    ​ 单线程程序,恰似苦逼程序猿凯叔的孤独加班夜。凯叔就是整个项目的唯一执行者,从接收需求、编码实现到测试调试,所有环节都得亲力亲为,无人分担。就像一台计算机上的单线程程序,它在同一时间内只能专注于处理一项任务,从头至尾,按部就班,不能分身。

    ​ 想象一下,凯叔坐在空荡荡的办公室,四周只有敲击键盘的声音陪伴。他先完成数据库查询(第一幕),接着处理数据逻辑(第二幕),最后输出结果(第三幕),每个步骤都要等到前一步彻底完成后才能开始。这样的工作模式稳定而简单,却极其低效,尤其是当任务繁多或某些操作耗时较长时,凯叔只能默默守候,夜越来越深,咖啡一杯接一杯,心中不禁憧憬着能有同事加入,大家分工合作,共同加速项目的推进。

    在这里插入图片描述

  • 寂寞的等待:就像等待恋人的回信时,你是选择一直盯着手机还是继续生活?

    ​ 在Java中,多线程的阻塞与非阻塞是描述线程在执行过程中遇到特定情况时的行为特征,主要涉及线程对于资源访问、任务等待及执行控制等方面。

    ​ 首先先讲一下基本概念:阻塞、非阻塞。这两个对于多线程来讲永远绕不开的话题,也是老生常谈的话题,面试也是必问的话题,我们不能逃避,也无法回避这个问题。这两个概念在编程中就如同等待恋人回信时的不同态度,既生动又贴切。

    阻塞(Blocking)

    ​ 当一个线程执行到某个操作时,如果该操作因为某些条件未满足而无法继续执行,导致线程进入等待状态,直到条件满足后才恢复执行,这个过程称为阻塞。阻塞期间,线程会释放CPU控制权,不消耗CPU时间,等待操作系统或外部事件的通知。

    ​ 就好比你发送了一条满载深情的信息给心仪的TA后,便开始了无尽的等待。你放下一切,眼睛紧紧盯着手机屏幕,连呼吸都似乎在暂停,生怕错过任何一个可能的震动或提示音。在这期间,你几乎不做其他任何事,整个世界仿佛都静止了,这就是阻塞状态——程序在等待某个操作(比如I/O操作)完成前,会暂停执行,不进行其他任务。

    常见场景

    • 等待资源: 当线程试图获取一个已经被其他线程持有的锁(例如,通过synchronized关键字或Lock接口)时,它会被阻塞,直到持有锁的线程释放锁。
    • I/O操作: 执行网络读写、文件读写等I/O操作时,如果没有设置为非阻塞模式,线程会阻塞直到操作完成。
    • 等待条件: 使用Object.wait()Condition.await()等方法等待特定条件满足时,线程也会进入阻塞状态
    非阻塞(Non-blocking)

    ​ 非阻塞操作允许线程在调用无法立即完成的情况下,不挂起线程,而是立即返回,允许线程继续执行其他任务。这意味着线程不会因为一个操作未完成而完全停止工作,提高了CPU的利用率和程序的响应性。

    ​ 非阻塞像是一种更为洒脱的态度。信息发送出去后,你选择继续你的生活:看书、健身、或是和朋友相聚,手机放在一旁,虽然心里有所期待,但并不让它成为生活的全部。当消息来临时,自然会知道,但这不妨碍你享受当前的每一刻。在编程中,非阻塞意味着程序发起请求后,并不等待结果,而是继续执行后续代码,它可能通过轮询、回调函数或事件通知等方式,在未来某个时刻得知操作的结果,从而实现了高效率的并发处理。

    实现机制

    • 轮询: 不断检查操作是否完成,这种方式可能会消耗较多CPU资源。
    • 回调函数: 提供一个函数,当操作完成时由系统调用,避免了主动等待。
    • Future/Promise模式: 异步获取结果,线程可以继续执行,稍后通过Future对象查询或接收完成通知。
    Java中的应用
    • NIO (New Input/Output): 提供了非阻塞的I/O操作,通过Selector选择器可以监控多个通道的事件,无需为每个连接分配单独的线程。
    • 并发工具类: ConcurrentHashMap, CountDownLatch, Semaphore等提供了非阻塞或有限阻塞的机制来协调线程间的操作。
    PS:这里提到了NIO,其实关于NIO,IO,BIO也是一个面试中经常问到的问题。这里简单介绍一下。

    同步阻塞I/O(BIO)

    同步阻塞I/O,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解

    同步非阻塞I/O(NIO)

    同步非阻塞I/O,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持

    异步非阻塞I/O(AIO)

    异步非阻塞I/O,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。

    IO与NIO区别

    ​ Java NIO(New IO)是从 Java 1.4 版本开始引入的一个新的 IO API,可以替代标准的 Java IO API。NIO 与原来的 IO 有同样的作用和目的,但是使用方式完全不同,NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。

    ​ Java NIO 系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。简而言之,Channel 负责传输,Buffer 负责存储

未完待续:后面《情窦初开:多线程的甜蜜相遇》,主要先讲一下同步异步是啥子个回事儿


http://www.mrgr.cn/p/07500618

相关文章

【汇总】虚拟机网络不通(Xshell无法连接虚拟机)排查方法

搜索关键字关键字关键字:虚拟机虚拟机虚拟机连接失败、虚拟机无法连接、Xshell连接失败、ping baidu.com失败、静态IP设置 Kali、CentOS、远程连接 描述:物理机无法连接虚拟机;虚拟机无法访问百度,虚拟机无法访问baidu.com 虚拟机…

C# WCF服务(由于内部错误,服务器无法处理该请求。)

由于内部错误&#xff0c;服务器无法处理该请求。有关该错误的详细信息&#xff0c;请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端&#xff0c;或打开对每个 Microsoft .NET …

为 Flutter 应用设置主题:ThemeData 和 ColorScheme 指南

在媒体和其他来源中有许多关于这个主题的文章&#xff0c;那么这篇文章的必要性是什么&#xff1f; 在本文中&#xff0c;我计划仅关注 ThemeData 小部件的关键点以及我的开发经验中最常用的参数&#xff0c;并且您将获得有关每个参数如何对您的应用程序执行操作的简要说明。 …

Linux:进程信号

生活角度的信号 a.信号在生活中&#xff0c;随时可以产生(信号的产生和我是异步的) b.你能认识这个信号 c.我们知道信号产生了&#xff0c;我能识别这个信号&#xff0c;信号该怎么处理 d.我们可能正在做着更重要的事情&#xff0c;把到来的信号暂不处理(1.我记得这个事 2.…

分布式 ID 的实现方案——Java全栈知识(13)

分布式 ID 的实现方案 当我们分表的情况下&#xff0c;如何实现全局唯一 ID 也是一个问题&#xff0c;数据库的唯一索引在 分布式 ID 也就是全局唯一 ID 生产方案需要满足以下几个条件&#xff1a; 高可用高性能安全性自增性唯一性 1、UUID UUID&#xff08;Universally Un…

cobalt strike安装教程

将本地IP和密码填入:./teamserver 192.168.xx.xx 密码 启动成功

初识C语言——第十五天

初识结构体1 //结构体可以让C语言创建新的类型出来 //创建一个学生struct Stu {char name[20];int age;double score;}; //创建一个书的类型 struct Book {char name[20];float price;char id[30]; };//int main() //{ // struct Stu s { "张三",20,85.5 };//结…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

WDS+MDT网络启动自动部署windows(十七)MDT中文变量,描述,组织单位OU

简介 这简直就是歧视,在MDT使用变量时,数据库设置时,居然不能用中文。 计算机描述,我将在数据库中设置为使用人,主要是其他地方也不方便看。 描述是存在注册表中的,未来自动化也将会使用使用人这个字段,用来注册OCS这样,有标签,使用人字段的软件。 方向 解决MDT/BDD无…

蓝桥杯练习系统(算法训练)ALGO-950 逆序数奇偶

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 老虎moreD是一个勤于思考的青年&#xff0c;线性代数行列式时&#xff0c;其定义中提到了逆序数这一概念。不过众所周知我们…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了…

刷题训练之模拟

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握模拟算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题训…

Ansible——playbook编写

一、简介 1.什么是playbook Ansible Playbook 是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的 IT 操作。Ansible Playbook 对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook 本质上是一些框架&#xff0c;是一些预先编…

pytest教程-41-钩子函数-pytest_runtest_teardown

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_call钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_teardown钩子函数的使用方法。 pytest_runtest_teardown 钩子函数在每个测试用例执行完成后被调用&…

商务分析方法与工具(五):Python的趣味快捷-文件和文件夹操作自动化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Web前端三大主流框架是什么?

Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位&#xff0c;各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架&#xff0c;最初版本称为AngularJS&#xff0c;后来升级为Angular。它是一个完整的…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 &#xff08;1&#xff09;白鲸优化算法BWO 参考文献&#xff1a;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. &#xff08;2&#xff09;龙格-库塔优化…

三维建模技术在AI去衣中的奇妙应用

引言&#xff1a; 随着计算机视觉和深度学习技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;在图像处理和理解方面取得了显著进展。其中&#xff0c;一个颇具争议却技术上引人入胜的应用便是AI去衣——即使用AI技术从图片或视频中移除人物的衣物。尽管这技术常因…

WDS+MDT网络启动自动部署windows(十六)计算机自动进入指定OU

简介 新装计算机总是在默认电脑,不方便配置终端计算机策略权限。 要想办法让MDT装好的计算机,自动进入指定组织单位OU。 dsquery 大概意思是 domain server query ,就是域服务器搜索的意思。 在域控执行 dsquery ou 先看看OU是怎么用LDAP表示的。 从左到右,OU,逐级的组…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…