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

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

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

  • 单线程的独白

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

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

    在这里插入图片描述

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

    ​ 在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.mfbz.cn/a/605128.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于二维CS-SCHT变换和扩频方法的彩色图像水印嵌入和提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................. % figure; % subplot(121);…

GitLab使用记录

GitLab 文章目录 1. 常用命令1.1 配置邮箱 用户名1.2 查看配置1.3 基本语法 2. 连接gitlab3. 直接拉去项目 1. 常用命令 1.1 配置邮箱 用户名 git config --global user.name ShangzheChen git config --global user.email 735511377qq.com1.2 查看配置 cat ~/.gitconfig这…

SpringCloud微服务之Eureka、Ribbon、Nacos详解

SpringCloud微服务之Eureka、Ribbon、Nacos详解 1、认识微服务1.1、单体架构1.2、分布式架构1.3、微服务1.4、SpringCloud 2、服务拆分与远程调用2.1、服务拆分的原则2.2、服务拆分示例2.2、提供者与消费者 3、Eureka注册中心3.1、Eureka的结构和作用3.2、搭建eureka-server3.2…

图像处理:图像噪声添加

文章目录 前言一、高斯噪声二、椒盐噪声三、泊松噪声四、斑点噪声五、指数噪声六、均匀噪声总结 前言 本文主要介绍几种添加图像噪声的方法,用于数据增强等操作。 以下图为例。 一、高斯噪声 高斯噪声就是给图片添加一个服从高斯分布的噪声,可以通过调…

Java | Leetcode Java题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> temp new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> combine(int n, int k) {List&l…

Java | Leetcode Java题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {dfs(0, nums…

Pikachu 靶场 CSRF 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

scala速通(精简版)

1.变量和常量 var name [:VariableType] value // variable val name [:ConstantType] value // constant1.声明变量时&#xff0c;类型可以省略 2.类型定义后就不能修改言 3.变量声明必须有初始值 4.变量&#xff0c;常量分别用var&#xff0c;val声明修饰 2.标识符命名…

Google Pixel4手机刷机+Root+逆向环境详细教程

Google Pixel4手机刷机Root逆向环境配置详细教程 刷机工具下载 Windows10、Google Pixel4手机当前安卓10系统、adb工具、要刷的谷歌原生的Android11最新刷机包、安装google usb驱动、美版临时twrp-3.6.0_11-0-flame.img和美版永久twrp-installer-3.6.0_11-0-flame.zip、Magis…

webservice和TCP类型接口测试

1.webservice类型接口 1.1.webservice类型接口介绍 Web服务&#xff08;WebService&#xff09;是一种基于网络的应用程序接口&#xff08;API&#xff09;&#xff0c;可通过网络来进行通信和交互。它们使用标准化的协议和格式来进行通信&#xff0c;最常见的是使用XML&#…

Jmeter页面汉化和字体显示过小调整

在频繁解压使用Jmeter的时候&#xff0c;经常会遇到需要将页面的英文调整为中文&#xff0c;页面文字和编辑区域内容文字显示较小的问题&#xff0c;记录一下方便以后查阅。 1.页面汉化 Jmeter在解压启动之后页面显示是英文&#xff0c;如果需要修改为中文&#xff0c;可以修改…

【Python】在Windows Server上部署Flask后端服务器

想要在Windows Server上部署flask应用&#xff0c;当然不能只下一个anaconda配完环境之后直接启动py文件&#xff0c;这样的话后台会有一段警告&#xff1a; * Serving Flask app app* Debug mode: off WARNING: This is a development server. Do not use it in a production …

【氮化镓】GaN功率器件在转换器设计中的挑战

I. 引言(INTRODUCTION) 宽带隙(WBG)器件的重要性: 引言部分首先强调了宽带隙(WBG)器件在高频、高效率电力电子技术中的关键作用。这些器件,包括碳化硅(SiC)和氮化镓(GaN),相较于传统的硅功率器件,具有显著的优势。宽带隙半导体材料的高击穿场强允许设计更薄的漂…

了解内存函数

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 内存函数不止malloc、calloc、realloc、free还有memcpy、memmove、memset、memcmp。前四个的头文件是<stdlib.h>,后四个的头文件是<strin…

HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架

网页基本信息 DOCTYPE是设置使用什么规范&#xff0c;网页整个信息都在html标签中&#xff0c;head标签里包含字符集设置&#xff0c;网页介绍等信息&#xff0c;title标签是网页的名称&#xff0c;网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…

【项目实战】使用Yolov8 + tesseract 实现身份证信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于实验,毕业设计参考等。整体效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录 一 数据集制作

WPF之多种视图切换

1&#xff0c;View切换&#xff0c;效果呈现 视图1 视图2 视图3 2&#xff0c;在Xaml中添加Listview控件&#xff0c;Combobox控件。 <Grid ><Grid.RowDefinitions><RowDefinition Height"143*"/><RowDefinition Height"30"/>&l…

Ubuntu 下串口工具:Minicom、CuteCom 和 Screen

在 Ubuntu 中&#xff0c;对于串口通信工具的选择&#xff0c;虽然没有一个绝对的 “最好用” 的排名&#xff0c;但根据用户反馈和工具的流行程度&#xff0c;Minicom、CuteCom 和 Screen 这三个工具通常被认为是较为受欢迎和实用的。 一、简介&#xff1a; Minicom&#xff…

一款功能强大的网络安全综合工具-PotatoTool

一、 简介 这款工具是一款功能强大的网络安全综合工具&#xff0c;旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能&#xff0c;包括解密、分析、扫描、溯源等&#xff0c;为用户提供了便捷的操作界面和丰富的功能选择。 二…

英语学习笔记6——What make is it?

What make is it? 它是什么牌子的&#xff1f; make n.&#xff08;产品的&#xff09;品牌名称    v. 制作 区别&#xff1a;model n.&#xff08;产品的&#xff09;型号       n. 模型       n. 模特 make 指的是大的品牌名称&#xff0c; model 是旗下产品…