多线程讲解(二)

浅谈C++中的多线程(三):Qt中的多线程应用 本篇文章围绕以下几个问题展开: 何为进程?何为线程?两者有何区别? 何为并发?C++中如何解决并发问题?C++中多线程的语言实现? 同步互斥原理以及多进程和多线程中实现同步互斥的两种方法 Qt中的多线程应用 前三个问题已经在之前两篇文章中讲解,本篇文章作为结尾篇来讲解最后一个问题:Qt中的多线程应用。 四.Qt中的多线程应用 1.引入 程序由单线程到多线程,就像以前是一个人干... 阅读详情

目录标题

什么是静态代理模式

在这里插入图片描述

重点 静态代理和线程的对比

下图红线部分两个方法在意义上相同!




重点!(婚庆公司来描述线程底部功能的实现原理)
HappyMarry()方法 是在一个接口中定义的一个方法体 里面没有方法内容
而You();类中实现了方法这个接口 创建了HappyMarry()方法里面的内容
可以用来理解多线程这个原理

在这里插入图片描述

练习一

练习内容 婚庆公司代理你整理你结婚的大部分事情




//静态代理讲解
//讲解婚庆结婚公司代理你整理结婚内务



//总结:
//真实对象和代理对象都要实现同一个接口
//而且代理对象要代理真实的对象 而不是自己本身
//好处:代理对象可以做很多真实对象做不了的事情
//真实对象专注做自己的事情



//接口
//重点:接口中只需要创建方法的名字
//不用写方法体的内容
interface Marry{
void HappyMarry();
}



//实现接口
//真实角色 自己去结婚
class You implements Marry{
@Override
public void HappyMarry() {
System.out.println(“结婚了 很开心”);
}
}

@Override
public void HappyMarry() {
before();
//this.target.HappyMarry(); 重点:这行代码的意思时
//this.target 为一个参数 意思为 :
// 传进来的参数调用该参数类方法中实现接口HappyMarry方法中的内容
this.target.HappyMarry();//这个是真实结婚对象
after();
}



在这里插入图片描述

在这里插入图片描述

lamda表达式

在这里插入图片描述

为什么用lamda以及理解

在这里插入图片描述

在这里插入图片描述

函数式接口的定义:任何接口 只包含唯一一个抽象方法 那么他就是一个函数式接口
对于函数式接口 我们可以通过lambda表达式来创建该接口的对象




练习一

推导lambda表达式
//复习前面知识的内容
//重点:
//复习结果:静态内部类是放在类中方法体外的类
//而局部内部类和匿名内部类是放在类中方法体内的类




//优化 由于Like类放在外部比较麻烦 可以放在类内
//所以利用静态内部类
//3 静态内部类(类名前面必须加static)
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println(“i like lambda2”);
}
}




//接口去重新创建一个它的实现类对象
ILike like = new Like();
like.lambda();



//1 定义一个函数式接口
interface ILike{
void lambda();
}

//2 实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println(“i like lambda”);
}
}



在这里插入图片描述

在这里插入图片描述

练习二

练习lambda表达式中 (当函数式接口带多个参数时)


在这里插入图片描述

练习三

(重点:为什么学习lambda表达式
解释一:因为多线程 runnable接口中是函数式接口 可以利用lambda表达式来简化代码)




但函数式接口的方法中不止有一个参数时 lambda表达式
怎么去表达




重点:ILove love=null; 函数式接口定义一个对象去实现它的接口 但是 后面是null的是意思是没有类去实现(implement)
这个函数接口 直接定义为null
但是当有类(class)去实现函数式接口, 函数式接口定义一个对象去实现它的接口的代码为:
下图所示



在这里插入图片描述

但函数式接口的方法中不止有一个参数时 lambda表达式
怎么去表达

在这里插入图片描述

一 线程的状态

在这里插入图片描述

二 线程方法

在这里插入图片描述

三 停止线程

在这里插入图片描述

练习一

重点
//1 设置一个标志位
private boolean flag=true;




//2 设置一个公开的方法停止线程 转换标志位
public void stop(){
//注意这里是改变标志位的值为false
this.flag=false;
}




if (i==800){
//调用stop方法 切换标志位(改变值) 让线程停止
testStop.stop();
System.out.println(“线程该停止了”);
}



在这里插入图片描述

四 线程休眠

1000ms(毫秒)=1s(秒)
重点 每一个对象都有一把锁 sleep不会释放锁
而且sleep存在异常



在这里插入图片描述

练习一

当没有时间延迟时代码
可以看到电脑cpu运行太快 导致 黄牛党拿到全部的票数



在这里插入图片描述

练习二

添加网络延时后
可以看到 小明 小红 和黄牛党全部参与到了抢票的过程中



但是也发现了问题的所在性 出现了第0票



//模拟网络延时 sleep
//模拟网络延时的好处 :放大问题的发生性
// (比如该代码运行到最后发现 黄牛党拿到第0票
// 显然是错的的 因为没有第0票的票数)




//添加模拟延时
//延时了100毫秒 也就是0.1秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}



在这里插入图片描述

练习三

模拟倒计时 tenDOwn
//下行代码 每隔一秒打印一个数字
tenDOwn();


在这里插入图片描述
在这里插入图片描述

练习三

打印当前的系统时间
利用线程里面的sleep方法



//打印当前系统时间(因为时间秒 就是每隔一秒变换的)
import java.text.SimpleDateFormat;
import java.util.Date;
//模拟推迟
public class TestSleep3 {
public static void main(String[] args) {
//打印当前系统时间
Date date = new Date(System.currentTimeMillis());//获取当前的系统时间
while (true){
try {
Thread.sleep(1000);
//输出当前的系统时间
System.out.println(new SimpleDateFormat(“HH:mm:ss”).format(date));
date=new Date(System.currentTimeMillis());//更新当前的系统时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}




在这里插入图片描述

五 线程礼让

yield 礼让
礼让不一定成功 看cpu心情

在这里插入图片描述

线程一

// 测试礼让线程
// 礼让不一定成功 看cpu心情
Thread.yield();//线程礼让



在这里插入图片描述

在这里插入图片描述

六 线程强制执行_join

在这里插入图片描述

练习一

//测试线程join方法
//想象为插队



//主线程
for (int i = 0; i < 100; i++) {
if (i==10){
//插队开始
thread.join();
}
System.out.println(“main”+i);
}



这里可以看到 当插队开始的时候 一直是等到插队的thread线程全部运行完才让main线程执行的


在这里插入图片描述

七 线程状态观测

在这里插入图片描述

线程的状态
NEW新生状态 RUNNABLE运行状态
WAITING等待状态 TIME_WAITING退出状态



在这里插入图片描述

练习一

//先创建一个线程
//lambda表达式
Thread thread = new Thread(()->{



//线程运行过程中 设sleep方法 处于等待状态
for (int i = 0; i < 2; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(“…”);
});


在这里插入图片描述

八 线程的优先级

priority 优先级

在这里插入图片描述

class MyPriority implements Runnable{
@Override
public void run() {
//下行代码意思: 获取线程的名字还有优先级
System.out.println(Thread.currentThread().getName()+“—>”
+Thread.currentThread().getPriority());
}
}




在这里插入图片描述

九 守护线程

daemon 线程

在这里插入图片描述

//测试守护线程
//上帝守护你 练习
//重点: 虚拟机不用等待 守护线程执行完毕
//但是虚拟机必须要确保用户线程执行完毕
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
You you = new You();
Thread thread = new Thread(god);
//默认是false 则表示用户线程 正常的线程都是用户线程
thread.setDaemon(true);
thread.start();//上帝守护线程启动
new Thread(you).start();//你 表示用户线程启动了
}
}


在这里插入图片描述

Java多线程实现方式 线程实现方式 创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤 创建一个Thread类的子类 在Thread类的子类中重写Thread类中的run()方法,设置线程任务(开启线程要做什么?) 创建Thread类中的方法start()方法,开启新的线程,执行run()方法。 voi... 阅读详情

相关推荐

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4785

多线程讲解系列二

java虚拟机允许应用程序并发的运行多个程序,在java语言中,多线程实现可以有以下三种方法 (1)继承Thread类,重写run()方法 Thread本质上也是实现了Runnable接口的一个实列。它代表一个线程的实列,并且,启动线程的唯一方法就是通过Thread类的start()方法,start()方法是一个native(本地)方法,它将启动一个新线程,并执行run()方法(Thread中...

sdgames的博客 145

Ubuntu 22.04远程桌面终极指南:从零配置RDP到解决黑屏问题

本文提供了一份Ubuntu 22.04远程桌面配置的终极指南,详细讲解了如何从零开始安装和配置RDP服务,并重点解决了连接后常见的黑屏问题。通过分析会话冲突、修复启动脚本及配置权限策略,帮助用户实现稳定、高效的远程桌面连接,优化分辨率、禁用锁屏,打造无缝的远程工作体验。

sony5的博客 1386

Android多线程讲解二

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。Java1.5版本对其进行了重构,现在的Java仍沿用了Java1.5的版本。Jmm遇到的问题与现代计算机中遇到的问题是差不多的。物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义。

袁震的博客 381

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 817

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

(二)多线程基础篇 —— Synchronized 多线程同步讲解

前言: 在Java多线程编程中,我们长需要考虑线程安全问题,其中关键字Synchronized,在线程同步中扮演着重要的作用,我将讲解Java关键字Synchronized的知识 1.定义 Synchronized 是Java中的一个关键字,被Synchronized修饰的方法 / 代码,保证同一时刻最多只有1个线程执行 。 2.Synchronized 原理 实现原理: JVM 是通过进入、退出对象监视器(Monitor)来实现对方法、同步块的同步的,而对象监视器的本质依赖于底...

tunmengsmile的博客 411

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek

Win10环境借助DockerDesktop部署Open web UI集成DeepSeek,并借助DuckDuckGo实现联网查询

虎鲸不是鱼 1705

Linux多线程编程讲解之系列二

在上一篇文章中,我们谈到了会导致异常结果的线程代码。两个线程分别对同一个全局变量进行了二十次加一。变量的值最后应该是 40,但最终值却是 21。这是怎么回事呢?因为一个线程不停地“取消”了另一个线程执行的加一操作,所以产生这个问题。现在让我们来查看改正后的代码,它使用 互斥对象(mutex)来解决该问题: #include #include #include #include int

职场里拉开差距的不是知识,而是认知! 624

微信小程序 - 解决video视频播放黑屏只有声音没有画面问题,使用Video标签无法播放视频失败只有声音、黑屏视频播放不了,安卓手机/苹果ios视频只有声音却没有画面(uniapp微信小程序也适用)

微信小程序video有声音但是画面黑屏,uni-app微信小程序视频播放黑屏但是有音频,微信小程序video android真机或苹果ios系统中黑屏 只有声音没有画面,Uniapp微信小程序 Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法,解决小程序视频编码兼容性问题导致黑屏,出现黑屏但有声音的问题,video标签播放视频有声音,但是黑屏的原因及解决办法,mp4视频编码的问题,video标签播放视频有声音,但是黑屏。uniapp使用video标签无法播放视频出现黑屏问题处理,如何解

🏆 前端领域优质创作者 7784

9.16华为OD机试真题 新系统 - 统计特殊数字 (Java/Py/C/C++/Js/Go)

9.16华为OD机试真题 新系统 - 统计特殊数字 (Java/Py/C/C++/Js/Go)

算法大师! 783

java面试题超详细讲解《多线程篇》二

单例模式 双重校验锁实现对象单例(线程安全) public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getUniqueInstance() { //先判断对象是否已经实例过,没有实例化过才进入加锁代码 if (uniqueInstance == ...

hutubiancheng的博客 144

24. SAP UI5 应用如何使用 OData 数据模型

本教程之前的二十三个步骤,使用的数据模型都是 JSON 模型。从本步骤开始,我们要学习另一种非常重要的数据模型:OData 数据模型。 OData 数据模型也是 SAP 产品里广泛使用的数据模型,比如 SAP S/4HANA,SAP CRM Fiori 应用等等,都使用的是 OData 数据模型而不是 JSON 数据模型。 使用 OData 数据模型的典型场景就是,通过 OData 模型提供的 Read API,将远端服务器上存储的数据通过 OData 协议读取到客户端,并显示在 SAP UI5 应用里。.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5801

详细讲解 —— 多线程(二)Thread类及常见方法(Java EE初阶)

本文主要介绍了多线程的Thread类及常见方法。其中包含了Thread类常见构造方法、Thread 的几个常见属、启动一个线程-start()、中断一个线程、等待一个线程-join()、获取当前线程引用、休眠当前线程等等操作。本文通俗易懂,如有错误,欢迎大家指正,希望和大家共同进步。......

IT_Infector的博客 613

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java多线程与线程池技术讲解(二)

多线程

x_123zai的博客 194

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c/c++: 多线程编程基础讲解(二)

在基础一上思考,如果线程调用的函数是在一个类中怎么办?答案是将该函数写成静态成员函数,如下模式就很符合C++的写作模式: #include #include using namespace std; #define NUM_THREADS 5 class Hello { public: static void* say_hello(void* a

懒猫会打盹的专栏 8978

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Linux/C++多线程篇(二) 】给线程装上“红绿灯”:通俗易懂的同步互斥机制讲解 & C++ 11下的多线程

本文以“交通红绿灯”为喻,通俗易懂地解析多线程编程中的同步互斥机制。文章首先剖析竞态条件成因,随后详解 POSIX 标准下的互斥锁、无名信号量及条件变量 API,并通过生产者 - 消费者模型演示实战用法。此外,深入介绍 C++11 原生线程库,涵盖 std::thread、std::mutex、lock_guard 及 condition_variable 等核心组件。从底层 C 接口到现代 C++ 封装,助你彻底掌握线程安全核心,轻松驾驭多核并发编程。

2501_93095927的博客 1630

C语言多线程编程入门:pthread库实战案例详解

在当今的软件开发领域,多线程编程已经成为了提高程序性能和响应能力的重要手段。C语言作为一门经典且高效的编程语言,通过`pthread`库为开发者提供了强大的多线程编程支持。`pthread`库是POSIX线程库的实现,它允许开发者在C语言程序中创建、管理和同步多个线程。本文将带领大家从基础概念入手,通过多个实战案例详细介绍`pthread`库的使用,帮助技术人员快速入门C语言多线程编程。

星辰夜语的博客 705

第十六节:第一部分:多线程:概述、线程创建方式一、创建方式二Runnable

本文介绍了Java多线程编程的两种创建方式。第一种是继承Thread类,通过重写run方法定义线程任务;第二种是实现Runnable接口,将任务对象传递给Thread对象。文章还展示了使用匿名内部类和Lambda表达式简化实现的写法。每种方式都提供了完整代码示例和执行结果,展示了主线程和子线程的并发执行效果。通过比较可以看出,实现Runnable接口的方式更灵活,避免了Java单继承的限制,是更推荐的线程创建方式。

枣伊吕波的博客 280

多线程(一)

1、什么是多线程? 先了解两个概念 进程:正在运行的程序,是系统进行资源分配和调用的独立单位,有自己的内存空间和系统资源。 线程:是进程中的单个顺序控制流,是一条执行路径,线程是应用程序中执行的基本单元。 某位大神的总结:进程就相当于工厂,线程就是工厂里的流水线,线程不能独立存在,必须存在于进程中。 多进程:系统中同时存在多个并行的进程,则称为多进程。可通过电脑任务管理器查看正在运行

沐淼的博客 270

多线程中的售票问题

在日常生活中我们可以观察到售票是多个窗口进行售票的,那么他是如何解决票如何卖完的呢。 这里就涉及到了多线程的问题了。 方案一: package thread; /** * @auther 言行 */ public class SellTicket { public static void main(String[] args) { SellTicket01 sellTicket01 = new SellTicket01(); SellTicket01 s

lanjingyuya的博客 1356

后端笔试题-多线程JUC相关

ReentranLock的Candition实现精确的线程唤醒,避免了synchronized的随机唤醒问题,并且增加线程中断的处理等。a打印完后就加1,进入等待状态,让b醒来进行打印,b打印完进入等待,唤醒a进行打印,交替操作实现。通过“参数配置→任务拆分→并行计算→结果汇总”四步,实现了素数查找任务的多线程并行加速。遍历所有PrimeCounter实例,累加每个线程的素数计数得到totalPrimes。计算并输出总耗时(endTime - startTime)和总素数数量。

小泽的博客 544

多线程一

# Python中提供了threading模块来对多线程的操作 import threading def worker(n): print("start worker{0}".format(n)) # 方法二:从Thread继承,并重写run() class MyThread(threading.Thread): def __init__(self,args):

菜鸟之神的博客 200

Java 多线程的两种实现方法

1.Thread类构造方法 Runnable target: //实现Runnable的对象 ThreadGroup group: //该线程所属的线程组 String name: //该线程的名字 如果name == null 系统会自动给线程设置一个唯一的名 public Thread(); public Thread(Runnable target); public Thread(ThreadGroup group,Runnable target); p

weixin_46258925的博客 179

python 线程锁_python3之多线程及线程锁的基础用法

python多线程库Python3 通过两个标准库 _thread 和 threading 提供对线程的支持。_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。这里我们学习的是 threading 这个库。python多线程实现1main.pymain.py在这里有2个函数:workA(job)和workB(job) 2个实际工作的...

weixin_39897758的博客 101
上一篇: 多线程讲解(一)
下一篇: 多线程讲解(三)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值