多线程技术

多核技术和多线程技术 在单个物理处理器芯片中集成多个独立的计算核心(CPU Core),每个核心可以独立执行指令。 阅读详情

一些概念:

|--进程:就是一个正在执行中的程序;

|--线程:就是进程中的一个独立的控制单元;线程在控制着进程的执行;

|--一个进程中至少有一个线程;

|--java虚拟机启动的时候会有一个进程java,exe    该进程中至少有一个线程负责java程序的执行,而且这个线程运行的代码存在与main方法中,该线程称为主线程;

|--jvm启动的时候不止一个线程,还有一个垃圾回收的线程,另一个是主线程同时子啊执行;

|--多线程的出现:可以是多部分代码同事进行;-->提高了效率;多条路径同时执行;

创建线程:

|--自己自定义的去创建一些线程,让某些代码可以同时执行

|--如何在自定义一个线程呢?

|--Thread:线程 是程序中的执行线程,Java 虚拟机允许应用程序并发地运行多个执行线程。

|--创建新执行线程有两种方法。一种方法是将类声明为Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。-->第一种方式就是继承Thread类,还要覆盖run方法;

|--步骤:

定义类继承Thread;

复写Thread类中的run方法;目的是就将自定义的代码存储在run方法,让线程运行;

调用线程的start方法;-->该方法有两个作用:启动线程,然后调用run方法;

|--d.run:仅仅是对象调用方法,而线程创建了,但是并没有运行   -->如果是d.run()的话,那么运行的是run里面覆盖的方法,然后在运行主函数里面的方法;

|--d.start:开启线程并执行该线程的run方法;如果是d.start()的话,那么就是多线程的运行状态;

|--另一种方法是声明实现Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。

|--发现每一次运行的结果都是不同的,cpu执行到谁谁就运行,在某一个时刻只能有一个程序运行;cpu做着快速的切换,已达到同时运行的效果;

|--多线程的特性:随机性-->谁抢到谁就执行,执行多长时间,是cpu说了算 

为什么要覆盖run方法呢?

|--Thread类是用来描述线程的;

|--该类就定义了一个功能,用于存储线程要执行的代码,该存储功能就是run方法;也就是说Thread类中的run方法是用来存储线程要运行的代码;

线程的状态

|--被创建也是一种状态

|--运行状态

|--冻结状态

|--消亡状态

获取线程名称和对象

|--线程也有自己的名称:线程都有自己默认的名称:Thread-编号,该编号是从0开始

|--currentThread():获取当前线程对象。该方法是静态的,直接用类名调用;

卖票程序

|--卖票是要多个窗口卖票,要同时出票,多个窗口要同时卖票;

|--

创建线程的第二种方法:

|--接口Runnable:可运行的;里面就只有一个方法;

|--实现Runnable接口;

步骤:

1、定义类实现Runnable接口

2、覆盖Runnable接口中的run方法;-->将线程要运行的代码存放在该run方法中

3、通过Thread类建立线程对象;

4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法;

|--原因:自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去指定指定对象的run方法;

5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

实现方式和继承方式有什么区别

|--由于java只支持单继承;当你有了自己的父类,但是这时候就不能再继承Thread了,但是你的里面有些代码是多线程锁执行的,那么这个时候,java工程师就对外提供了一个规则,你得符合我的规则我才能帮你办,那么学生就实现了一个接口,

|--通过以上的分析就是学生是人当中的一种,学生像Runnable,学生既继承了人这个类,有实现了Runnable,也就是实现了多线程;对外提供了功能性的扩展

|--实现方式和继承方式有什么区别:实现的方式避免了单继承的局限性,在定义线程时,建议使用实现方式;

|--还有一个就是线程要运行的代码存放的位子是不同的:继承Thread类:线程代码存放代码Thread子类run方法中

实现Runnable接口,线程代码存放在接口子类的run方法中

多线程的安全问题

|--多线程的安全隐患:

|--问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来,导致了共享数据的错误;

|--解决的办法:对多条操作共享数据的语句,只能让一个线程都执行完,再执行过程中其他的线程不可以参与执行;

|--java工程师提供了专业的解决方式:就是同步代码块

|--哪些代码需要同步,就看哪些代码是共享数据;

|--同步的经典例子:火车上的卫生间;

|--对象如同锁,持有锁的线程,可以在同步中执行,没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有锁;

|--同步的前提:必须要有两个或者两个以上的线程,才能要用到同步;

必须是多个线程使用同一个锁;要保证同步中只能有一个线程在运行;要保证你进去了,我就不能进,

|--同步的好处:解决了多线程的安全问题;

|--同步的弊端:多个线程需要判断锁,较为消耗资源;

同步函数用的锁

|--同步函数用的锁是this锁;

静态同步函数的锁

|--同步函数被静态修饰后,使用的锁是哪一个呢?通过验证,发现不是this了;因为静态方法中也不可以是this;

|--静态进内存的时候是没有对象的,是有类的,要封装成class对象,也就是字节码文件对象;

|--静态进内存时,是没有本类对象的,有该类对应的字节码文件对象;类名.class   该对象的类型是Class

|--同步函数被静态修饰后,用的锁是该类所属的字节码文件对象;也就是类名.class;

多线程访问懒汉式

|--懒汉式在进行多线程访问时,会出现安全隐患;

|--如果是同步函数的话,懒汉式如果加了同步会比较低效,每次都要判断锁,

面试懒汉式

问:懒汉式和饿汉式有什么不同?

答:懒汉式的特点在于实例的延迟加载。

问:懒汉式的延迟加载有没有什么问题?

答:懒汉式如果在多线程的访问时会出现安全隐患问题,

问:怎么解决?

答:可以加同步来解决,而加同步的方式,用同步函数和同步代码块都是可以的,但是同步加在同步函数上面会稍微有些低效,这时候用双重判断的形式,可以提高效率;

问:加同步的时候用的锁是哪一个?

答:该类所属的字节码文件对象;

面试的时候要问的;

请写一个延迟加载的单例设计示例;

同步还有一个小小的弊端

同步出现以后会出现的一个现象:

|--死锁现象:就是你持有一个锁,我也持有一个锁,我要到你的你面去运行,就要问你要锁,而你也要我的里面来运行,你也要问我要锁,我不放我的锁要进你的里面去,你不放你的锁要进我的里面来,谁都不放,就出现了死锁的现象,

|--中国人用筷子吃饭的例子:你不放你的筷子,我不放我的筷子,咱们谁也不要吃饭;

|--死锁的出现通常是同步中嵌套同步,而锁却是不同的;-->同步函数里面有同步代码快,同步代码快里面有同步函数;她们用的锁是不相同的;

|--一个线程拿个a锁想要到b里面来,而b锁想要到a里面来;两者都相持不下,就是进不来的; 

面试的时候要求写一个死锁的程序:就写这个locka里面有lockb,lockb里面有locka

多线程间通信

wait()与金额sleep()有什么区别?

wait():释放资源,释放锁

sleep():释放资源,不释放锁;

线程间通讯:其实就是多个线程在操作同一个资源;但是操作的动作不同;因此要放到两个不同的run方法中;

多线程的优先级

|--to String();覆盖了Object里面的toString的方法,建立了自己的方法,

|--返回的是 该线程的字符串的表现形式,包括线程名称,优先级和线程组;

|--优先级代表着强资源的频率

|--所有的线程,包括主线程的优先级默认都是5;

|--优先级最高是10;

|--最高优先级10,最低优先级1,线程的默认优先级5;

线程的生命周期:

|--有5个状态:被创建,运行,冻结,消亡,阻塞状态或者是临时状态

|--具备执行资格但是没有执行权:临时状态;

|--放弃执行资格:冻结状态

|--既有执行资格,又有执行权的是运行状态

QT实现串口通信 要实现串口通信,需要知道串口通信需要的信息 主要参数有:波特率、校验位、数据位、停止位、控制流 主要操作有:串口的打开和关闭、刷新设备串口、接发数据、开关显示灯等。 实现效果如图: 最后附赠完整源码。 第一步:在头文件中引入 QtSerialPort 类的两个头文件(必须引入) // 引入串口通信的两个头文件(第一步) #include <QtSerialPort/QSerialPort> // 提供访问串口的功能 #include <QtSerialPo 阅读详情

相关推荐

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8281

多线程技术还是非常重要的

多线程技术还是非常重要的 有时间还要多作研究,目前用的工程有几个,还没全程使用

684

ic后端学习笔记-floorplan

floorplan是布图规划,规划包括定义芯片的大小,定义芯片内各种模块、hard macros(硬核。比如RAM,ROM及其他IP模块等)、IO等的大小和位置,有时候还需要提前定义一些placement blockages,groups/regions等等,是后端设计的第一步,也是后续所有P&R工作的基础。floorplan与placement的区别是。

tfrofc的博客 5832

探索JAVA多线程编程技术的宝库:JAVA多线程编程技术PDF

探索JAVA多线程编程技术的宝库:JAVA多线程编程技术PDF 去发现同类优质开源项目:https://gitcode.com/ JAVA多线程编程技术PDF简介 深入掌握JAVA多线程编程,提升代码性能与稳定性。 项目介绍 在软件开发领域,多线程编程是一项关键技术,它能够有效提升应用程序的执行效率。在这样的背景下,《JAVA多线程编程技术PDF》应运而生,这是一份全面深入讲解JAVA多线程编程的...

gitblog_06716的博客 732

头歌操作系统2.3系统调用命令ls执行的系统调用

设置版本0内核为分析对象。然后一直c直到虚拟机出现。然后一直c就是答案了。

m0_74128952的博客 1万+

【Claude】Extra inputs are not permitted 错误:代理剥离 Beta 标头的解决方案 bug报错已解决

深入分析Claude Code Extra inputs are not permitted 400错误的技术原理,解析代理剥离Beta标头的根因与多种修复方案。

一键难忘的博客 151

多线程编程技术

 转自:http://blog.youkuaiyun.com/fengzhihua_395/archive/2008/01/10/2033814.aspx多线程编程技术 线程是比进程更小的单位,可以认为进程是由一个或多个线程组成的。据说以前的 400 版本并不支持真正的多线程技术,在 4.2版后才从内核上提供了对多线程的支持。总之写这份文档的时候,绝大部分版本应该可以支持。主要资料来源于 IB

风之子的专栏 1万+

【异常】claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径

如果claude方式1(临时):使用完整路径运行,比如:# Windows 批处理脚本示例 C:\你的脚本目录\claude . bat # PowerShell 脚本示例 C:\你的脚本目录\claude . ps1方式2(永久):将脚本所在文件夹添加到系统 PATH 环境变量(参考场景1的环境变量配置步骤),之后即可直接输入claude运行。错误核心原因:系统 PATH 环境变量中找不到claude对应的可执行文件/脚本。

奶爸的编程之路,也就一周冷个三天 3673

java多线程技术体系

下图是JAVA多线程的CORE技术体系整合

贾红平 2507

实战:利用 Agent Harness 自动化 PPT 制作

本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。

AI Agent Harness Engineering 571

ESP32网络开发实例-开发环境搭建

NodeMCU-ESP-32S开发环境搭建 NodeMCU-32S 最强的ESP32 开发板非盗版或副厂的CH340。WiFi 蓝牙ESP-32 可用Arduino IDE ESP32-S 是一款通用型WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。 此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MHz。用户可以切断CPU的电源,利用低

视觉与物联智能 3783

iOS的三种多线程技术

1.iOS的三种多线程技术1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐

LettingGo的博客 552

EtherCAT ROS2 入门教程(一)

本文介绍了EtherCAT驱动与ROS2的集成方案,主要包括三部分内容:1)在Ubuntu 22.04上安装IgH EtherCAT主站的详细步骤,包括内核配置、源码编译和网络适配器设置;2)构建ethercat_driver_ros2,通过ros2_control描述文件配置硬件接口和EtherCAT从站模块插件;3)使用方法,包括启动EtherCAT主站和运行配置包。该方案支持通过参数文件定义硬件接口,并提供通用和专用两种EtherCAT模块插件,便于开发基于EtherCAT的工业应用。

机器人控制与仿真应用 1531

硬件多线程技术、粗粒度、细粒度

任务被分解成许多小的子任务。线程间的同步开销相对较大,因为线程频繁地进行同步和切换上下文,但可以实现更高的并行度,更好地利用多核处理器的资源。共享资源导致线程之间存在竞争,性能提升有限,且并非真正的并行,在某些应用场景下可能不会有明显的性能提升,甚至可能由于资源竞争导致性能下降。在多线程编程和并行计算中,“粗粒度”和“细粒度”指的是任务分解的粒度大小,也就是将一个大的任务分解成多个子任务时,每个子任务的规模。显著提升处理能力,性能提升明显,容易通过软件实现并行化,且不会出现由于资源竞争导致性能下降的问题。

weixin_49342084的博客 2489

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《Java多线程编程核心技术》——多线程总结

第1章 Java多线程技能 本章主要介绍线程和进程的相关概念,多线程的实现和停止,以及Thread类中的核心方法,具体实现的代码可以参考《Java多线程编程核心技术》。 进程和线程 1.进程 一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。简单的说,进程就是一个程序的一次执行过程。 2.引入线程的动机和思路 操作系统采用进程机制使得多任务...

weixin_39754631的博客 4185

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

多线程技术概述

多线程技术概述 线程与进程 进程 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间 线程 是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少 有一个线程 线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分 成若干个线程 线程调度 分时调度 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。 抢占式调度 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机

w1637873512的博客 537

LabWindows™/CVI中的多线程技术

目录(?)[+] http://zone.ni.com/devzone/cda/tut/p/id/6943#toc3 LabWindows™/CVI中的多线程技术 2 ratings | 2.50 out of 5 Read in   Chinese (Simplified)  English |  Print Overview   多

Hi_Panda 5769

多线程技术要点

Java 的多线程是一种允许在一个程序中同时运行多个线程的技术。每个线程是独立的执行路径,可以并发执行,从而提高程序的效率和响应能力。进程是的基础,是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。可以理解为在一个进程中独立运行的子任务。

teerx的博客 1808

LabWindowCVI中的多线程技术

多线程,多任务和多处理这些术语经常被交替使用,但是他们在本质上不同的概念,多任务指的是操作系统具有在任务间快速切换使得这些任务看起来是在同步执行的能力。在一个抢占式多任务系统中,应用程序可以随时被暂停。使用多线程技术,应用程序可以把它的任务分配到单独的线程中执行。在多线程程序中,操作系统让一个线程的代码执行一段时间后会切换到另外的线程继续运行,暂停某个线程的运行而开始执行另一个线程的行为被称为线程...

hyyjiushiliangxing的博客 4094

Java 多线程编程核心技术

进程是操作系统的基础,是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动;是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。可以理解为在一个进程中独立运行的子任务。进程虽然是互相独立的,但它们可以互相通信的,较为通用的方式是使用 Socket 或 HTTP 协议。进程拥有共享的系统资源,比如内存,网络端口,供其内部线程使用。进程较重,因为创建进程需要操作系统分配资源,会占用内存。线程存在于进程中,是进程的一个子集,现有进程,后有线程。

weixin_45278293的博客 1586
上一篇: Java-面试题思路分析
下一篇: Java-集合类
fyldragonfyl
博客等级 码龄12年 9粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值