多线程讲解(一)

多线程系列(一) -线程技术入门知识讲解 在很多场景下,我们经常听到采用多线程编程,能显著的提升程序的执行效率。例如执行大批量数据的插入操作,采用单线程编程进行插入可能需要 30 分钟,采用多线程编程进行插入可能只需要 5 分钟就够了。既然多线程编程技术如此厉害,那什么是多线程呢? 阅读详情

目录标题

多线程简介

在这里插入图片描述

多任务

先来了解一下多任务

在这里插入图片描述

进程

process 进程
Thread 线程

在下面的图片中我们可以看到:当视频(进程process)开始播放的时候
可以看到 听到 声音和图像 字幕 这些线程(Thread)是同时进行的

在这里插入图片描述

process和Thread的区别



在这里插入图片描述




什么是线程

Thread 线程
线程就是CPU调度和执行的单位
通常一个进程中包含若干个线程

在这里插入图片描述

什么是多线程

在这里插入图片描述

普通方法调用和多线程调用的例子(重点)

在这里插入图片描述

线程创建的方法(重点)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

练习一

创建线程的方法一: 继承Thread类 重写run()方法 调用start方法开启线程



//重点: 调用 start方法时 是同时运行的
// 重点:(当你运行的东西比较少时 不容易观察出来是同时运行的)
// (可以将for循环改为 两千来调用试试)
// for (int i = 0; i < 2000; i++) { }
//而调用 run 方法时 是由先后顺序决定的
//调用start方法时 main方法 和线程中start方法是同时运行的(交替执行)
//重点: 当两个方法同时运行的 线程不一定同时运行 (而是看cpu调度安排)
TestThread1 testThread1 = new TestThread1();
testThread1.start();
//testThread1.run();




在这里插入图片描述

理解代码图片

在这里插入图片描述

练习二

练习 Thread 实现多线程同步下载图片

在这里插入图片描述

练习三

创建线程的第二种方式(实现Runnable接口)

在这里插入图片描述

重点:
//创建线程方式二: 实现runnable接口 重写run方法
// 执行线程需要丢入runnable接口实现类 调用start方法



//创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();



//创建线程对象 通过线程对象来开启我们的线程(代理功能)
Thread thread = new Thread(testThread3);
thread.start();
//new Thread(testThread3).start();//意思为上面两行代码的简写



在这里插入图片描述

重点总结:
继承Thread类 时只有一份资源
实现Runnable接口 时一份资源但多个代理
原因推荐使用实现Runnable接口创建线程
因为面向对象(oop)继承类的具有局限性 使用不方便灵活
因为Java的类只有单继承 extends 而接口可以多继承 方便灵活实现接口

在这里插入图片描述

实现Runnable接口和继承Thread类的区别:

因为Java是单继承 所以推荐使用Runnable接口

在这里插入图片描述

创建多线程练习

练习 多个线程同时操作同一个对象 买火车票的例子




发现问题:多个线程操作一个资源的情况下 线程不安全 数据紊乱




重点
System.out.println(Thread.currentThread().getName()+“–>拿到了第”+ticketNums–+“票”);

在这里插入图片描述

案例一 龟兔赛跑

在这里插入图片描述

//创建胜利者
//重点
//static 保证只有一个冠军winner
//因为:静态变量不属于对象 (static只执行一次)
//加入static 保证了冠军的唯一性
private static String winner;




//判断是否完成比赛
//重点:参考 顺序结构和选择结构详解
//复习:1 当一个if语句中由最多只能有一个else语句 而且else语句种必须在所有的else if语句之后
// 2 if语句中可以有若干个else if语句 而且它们必须在else语句之前 一旦其中一个else if语句中 检测结果为true 其他的else if
//以及else语句都将跳过执行
//3 return的意思为结束方法和返回一个结果
//4 方法的调用(复习)如果方法有返回值时则写出返回值类型 如 int类型 byte等类型
//如果方法没有返回值则用void 而且如果方法返回值是void
//那么方法调用的一定是一条语句
private boolean gameOver(int steps){
if ((winner != null)) {
//已经存在胜利者
return true;
}else {
if (steps>=100){
winner=Thread.currentThread().getName();
System.out.println(“winner is”+winner);
return true;
}
}
return false;
}




在这里插入图片描述

实现Callable接口(了解即可)

线程的创建方法三:实现Callable接口

在这里插入图片描述

重要四步骤


//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);



//提交执行
Future r1=ser.submit(t1);
Future r2=ser.submit(t2);
Future r3=ser.submit(t3);



//获取结果
boolean rs1=r1.get();
boolean rs2=r2.get();
boolean rs3=r3.get();



//打印返回值
System.out.println(rs1);
System.out.println(rs2);
System.out.println(rs3);



//关闭服务
ser.shutdown();



实现 Callable接口创建线程的好处
1 可以定义返回值(Boolean 等类型)
2 可以抛出异常



在这里插入图片描述

在这里插入图片描述

基于STM32、HAL库的IP5356M快充协议芯片简介及驱动程序设计 @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。* @param hip: IP5356M句柄指针。 阅读详情

相关推荐

学习笔记( 11 ) - 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

烟溪彭于晏的博客 2万+

多线程讲解一

线程概述: 线程: 线程是操作系统中重要概念之一。是程序运行的基本执行单元。在绝大多数平台上,Java程序是直接利用操作系统中的线程来运行的。当操作系统启动一个程序时,先在系统中建立一个进程,接着在这个进程中至少建立一个线程(称为主线程)作为程序运行的入口点。因此,线程是依附于进程而存在的,并且每个运行在操作系统中的程序(即进程)至少包含一个主线程。线程和进程一样,也有创建、销毁和切换等状态,但负...

qq_38830201的博客 252

SAP ERPsim生产拓展实验报告

ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗

m0_67262022的博客 2020

多线程之锁的详解讲解《一》

之前写过线程、线程池,但是并没有深入的讲解,因为线程 多线程是Java中的一个重要环节,不管是使用还是面试,都不可避免用到它,所以会拆开详细的讲解,如有缺陷,请指出,共同进步。 线程知识巩固第一节 线程知识巩固第二节 线程知识巩固第三节 线程知识巩固第四节 线程知识巩固第五节 线程池实现原理ThreadPoolExecutor 锁在我们的实际开发中用的不是很多,常用的也就Synchronize和v...

jhonjson的博客 421

解密Android相机框架:从HAL到应用层的全链路解析

本文深入解析Android相机框架的全链路架构,从应用层到硬件抽象层(HAL)再到驱动层,详细介绍了CamX-CHI架构的设计哲学与实战应用。通过HAL3接口、V4L2交互机制及Camera2 API的最佳实践,帮助开发者优化相机性能,解决多摄切换、预览卡顿等常见问题,提升成像效率与稳定性。

weixin_29238147的博客 408

麒麟系统下的多媒体革命:VLC在kylinV10上的性能优化与调试技巧

本文详细介绍了在麒麟kylinV10系统上优化VLC多媒体播放性能的实战技巧,特别针对飞腾FT-2000/4硬件平台。从源码编译调优到硬件加速配置,提供全面的性能提升方案,帮助开发者在国产操作系统上构建高效媒体播放环境。

weixin_29168675的博客 458

Java多线程基础讲解(一)

目录 前言 一、什么是多线程? 二、多线程的快速入门 三、多线程的三种创建方式 1.继承Tread类 2.实现Runnable接口 3.实现Callable接口 四、多线程的常用方法 前言 本文讲解了多线程的基础知识,针对java入门级别的读者,帮助其快速掌握并运用多线程。基础介绍帮助你快速了解多线程,快速入门帮你快速运用,处理较基础的问题,后面的篇章帮助你解决一些各种业务...

qq_47425497的博客 808

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

769

多线程讲解系列一

线程是指程序在执行过程中,能够执行程序代码的一个执行单元,在java语言中,线程有4种状态:运行,就绪,挂起和结束。 进程是指一段正在执行的程序,而线程有时也被称为轻量级进程,它是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段,数据段和堆空间)及一些进程级的资源(列如打开的文件),但是各个线程拥有自己的栈空间,进程与线程的对比关系如图 在操作系统...

sdgames的博客 248

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2901

知识图谱-KGE-语义匹配-双线性模型-2018:SimplE

【paper】 SimplE Embedding for Link Prediction in Knowledge Graphs 【简介】 本文是加拿大英属哥伦比亚大学的两位学者发表在 NIPS 2018 上的工作,文章提出了 SimplE(Simple Embedding)。这篇和前面一篇差不多,也是对 1927 年的 CP 进行改进(简化),传统CP为实体分配的两个向量是独立训练的,SimplE利用关系的逆在三元组打分函数中加上了一个对称项,使得每个实体的两个向量依赖学习,并且 SimplE 的复杂度随

u013250861的博客 959

多线程与同步代码块一步一讲解

线程是程序执行的一条路径, 一个进程中可以包含多条线程。多线程并发执行可以提高程序的效率,可以同时完成多项工作,多线程并发执行的实质就是CPU在做着高速的切换。多线程的应用场景:红蜘蛛同时共享屏幕及多个电脑;迅雷开启多条线程一起下载;QQ同时和多个人一起视频;服务器同时处理多个客户端请求。 并行和并发的区别 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU) 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个

qq_39652397的博客 590

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

EDEM-fluent耦合时出现的问题及摸索出的解决办法及DPM颗粒信息导出

zheaa的博客 5754

多线程与高并发(一)多线程基础讲解

前言 之前大一的学习JavaSE的时候,感觉大脑就是一团浆糊,根本学不懂,也不理解锁什么的概念,今天开始重新复习一下多线程。 进程与线程、并发与并行概念 进程:正在运行的程序。 线程:进程中的多条执行路径。 由概念定义可得,一个进程含有多个线程。我们最经典的例子就是我们的垃圾回收线程与主线程的关系。它们是两个不同的线程,但是同时运行,同时将部分数据在两个线程间可见,既垃圾回收线程一旦回收一个对象,那么主线程便可以立即知道其发生。即它们之间数据是共享的。 并发:多条线程在同一时间段内交替执行; 并行:多

菜鸟更要继续努力的博客 309

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java多线程编程要点 讲解 (一)

1、 认识Thread和Runnable Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。 Thread Test = new...

web开发自学 70

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

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

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

Linux多线程概述 了解如何正确运用线程是每一个优秀程序员必备的素质。线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。 那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

利用几篇文章简单记录下c与c++多线程编程基础入门的东西,每篇一个程序来记录,备忘。这些章节是由浅入深组织的,赖死狗! 在注释中讲吧,佛楼米! #include #include //头文件是必须的,符合posix标准使程序可移植众多平台 using namespace std; #define NUM_THREADS 5 void* say_hello(void* ar

懒猫会打盹的专栏 3万+

多线程高级讲解一:常见的线程安全的类有哪些 ?

Vector 与 ArrayList的区别: 他们的原理都是通过数组实现的,增删慢,查询快。 Vector是线程安全的,ArrayList线程不安全,效率高。 我们去看源码: Vector 的add方法是加了synchronized关键字,所以他是一个同步方法,线程是安全的,效率低,工作中即使要使用线程安全的List集合,也不使用Vector,而是用Collections工具类中的 Collections.synchronizedList(arrayList);他可以将线程不安全的Arra...

chuxin_mm的博客 1789

CAS、ABA 问题讲解-Java多线程(一)

Java 面试中必然会问到有关多线程方面的知识. 本文主要讲解多线程中的基础知识 CAS(Compare And Swap)机制和 ABA 问题. CAS 介绍 CAS 全称 Compare And Swap, 顾名思义就是比较和改变的意思. 在 Java 中比较常用的实现有 synchronize 的轻量级锁(有的地方也称为无锁、自旋锁可重入锁)、java.util.concurrent.atomic 包下的 Atomic 家族. 这些实现之间有一个共性: 经常配合循环操作,直到完成为止. 过程 所谓的

Java Developer Blog 262

Java 并发 (多线程) 讲解<一>

多线程的概念是相对于顺序编程 而言的,在顺序编程里,程序只能按照一条线进行执行,而多线程可以打破这一限制,实现并发 效果。 多线程的基本实现方式 继承Thread类 通过继承Thread类可以实现新的线程,这样会很简便,但一般来说,是不被建议这样使用的。 它最大的缺陷是,一旦继承了Thread类就无法继承别的类,对设计造成一定的影响。 以下的demo中,我们通过继

AndroidLover 701

Qt中多线程写法一(步骤讲解+代码+加演示)

1.线程简单介绍 进程 运行中的程序!没运行的不算 main函数开始运行 到 main函数结束 操作系统上资源调度的基本单位! 线程 函数 并发执行 操作系统上程序调度的基本单位! 同一进程内的线程 共享 进程的所有资源! 2.qt多进程怎么写 2.1. 创建类(继承QObject) 2.2 改为继承自QThread 2.3 重写QThread类中的run函数 2.4 信号与槽方式启动QThread对象的start函数 2.5 关联信号与槽,操作 2.6 线程结束 注意点: 线程结束 先 quit

qq_48985554的博客 1万+

多线程基础讲解一: 多线程与进程的理解(排除你对多线程的理解误区)

线程与进程的区别: 1. 系统运行的每一个程序都是一个进程。比如java,QQ,微信,360安全卫士等。 2. 一个进程可能有多个线程。比如java这个进程运行起来后,除了我们写的程序需要运行, 还有GC回收线程。 总结: 进程是所有线程的集合,每一个线程是进程中的一条执行路径。 多线程的作用: 提高程序运行效率。 解释:cup运行效率是特别高的,你不用放在那里也是浪费。可以把cpu想象成是很多人的集合,如果是单线程,那么就是1个人,其他人全部休息。 使用多线程的话,比如创建3个线程,就是在cpu

chuxin_mm的博客 318

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

多线程

x_123zai的博客 330
上一篇: 贪吃蛇游戏代码详解
下一篇: 多线程讲解(二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值