黑马程序员_多线程(概念和创建)

避坑指南:解决‘Logical volume contains a filesystem in use’错误,顺利完成LVM根目录扩容 本文详细解析了Linux系统中LVM根目录扩容时遇到的‘Logical volume contains a filesystem in use’错误,提供了从错误诊断到实战解决方案的完整指南。通过动态扩容技术、单用户模式操作和LVM快照等方案,帮助管理员顺利完成根目录扩容,避免数据丢失和系统崩溃。 阅读详情

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

多线程(概念和创建)

一、多线程概念

提到线程,就得提到进程,进程就是正在进行中的程序。但是进程并不是多个程序同步执行他们,而是cpu逐个执行,先执行一个程序,然后执行另一个程序,cpu这是其实是在进行快速切换,只是速度很快,我们看起来像是在同步执行。

线程进程里的东西,理解的来说,比如迅雷中下载一个软件,这个软件通常看到的不是一个整体下载的,而是分成很多压缩包同时在下载,这多个压缩包就会同时向服务端请求数据,这就是线程,整个软件就是进程。这样看来,一个进程里至少含有一个线程。

我们在运行java程序的时候,JVN也开启了一个javaexe的进程,程序中有主函数main,这个主函数中就含有一个线程,我们称之为主线程。之前,所学习的程序,都一直是单线程形式的。

多线程,可以使多个代码同时执行,提高了效率。

总结:

1、             进程是一个正在执行中的程序。每个进程都有一个执行顺序,该顺序是一个执行路径或者控制单元。

2、             线程是进程中的一个独立控制单元。线程在控制着进程的执行。

3、             一个线程至少有一个线程。

4、             多线程可以提高效率。

 

二、             创建多线程

创建多线程,现在就是在我们自己写的程序中加入多线程。

创建方式1

         步骤:1、创建一个类,继承Thread

                     2、复写Thread中的run方法

          3、建立子类对象,调用线程的start方法,该方法有两个作用,一是启动该线程,二是调用run方法。

以我自己的理解来描述:像异常中的自定义异常类,在多线程中,想要在主函数(我们现在常写的程序)中建立一个线程,首先要定义一类继承Thread,这个类必须复写run方法,这两步是必须的。这时线程还没有建立,我们需要在主函数中建立自定义类的对象,通过对象调用start方法,格式为:对象名.start() 。此处start方法,建立了一个新的线程,同时调用run方法,这就是我们要复写run方法的原因。

看一下示例程序:

publicclass TestOfJava {

    publicstaticvoid main(String[] args) {

       Demo d = new Demo();

       d.start();

       for(int x=0;x<60;x++){

           System.out.println("mainrun"+x);

       }

    }

}

class Demo extends Thread{

    publicvoid run(){

       for(int x=0;x<60;x++){

           System.out.println("Demorun"+x);

       }

      }

}

看上述程序,就是在主函数中开辟了一个新的线程,start开启新线程,同时调用了run方法。在主函数中,其实有两个线程,一个是主函数的线程,可以称之为主线程。现在又加入一个新线程,此时,这个javaexe进程中就有两个线程了。这两个线程不是同步进行的,可以看上述程序结果,是一会儿执行主线程,一会儿执行自定义线程。而且每次运行结果不一样。因为多个线程都在获取cpu执行权,cpu执行到谁,谁就运行。需要明确的一点是,在某个时刻,只能有一个程序在运行(仅限单cpu情况)。CPU实际上是在做快速切换动作,因为以毫秒计时,所以看上去是同时运行的效果。我们可以形象的把多线程的运行i型能够为看成在互相抢夺CPU执行权。这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行时间多长,cpu来决定。

 

具体为什么要覆盖run方法?

Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该代码功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。

我们创建一个新的线程,就是为了执行我们定义的代码,而start是开启新线程,当我们不覆盖run方法,Thread中的run方法中什么代码都没有,所以不覆盖run方法没有意义;当我们覆盖run方法,在run方法中加入我们要运行的代码,这样新建线程就可以执行我们自己定义的代码。

线程中常用方法:

static Thread currentThread():获取当前线程对象

getName():获取线程名称

setName():设置线程名称。注意:可以再子类中覆盖setName方法,或是在子类构造函数中调用父类构造函数即可。

 

创建线程总结:

1、  首先自定义线程要继承Thread类,使得其加入java线程体系。

2、  覆盖run方法,在run方法中加入我们要运行的程序。

run方法中,就是要存储我们想要运行的代码,就这个作用。

3、  建立自定义线程类的对象,调用start方法。

我们要在主函数中开启新线程,只有start方法能开启。如果直接调用run或者其他方法,其实这时就没有开启新线程,只是把我们定义的代码执行一遍,其实还是只有一个主线程。

4、  单cpu功能,同一时间只能执行一个程序

5、  多线程的特性就是随机性。

 

三、线程的五种运行状态

语言描述来说,一个线程继承Thread和复写run方法,然后荣国start方法建立了新线程,创建线程就是一个状态。建立线程后,我们自定义的程序就会运行,运行也是一个状态。当线程运行时,cpu在某一时刻只执行一个程序,那么其他程序就会等待,这就分了两种情况,一是没有运行资格,二是有有运行资格但是没有执行权,前一种称为冻结,简单来说就是放弃了执行资格,这其中也有两种状态,一是sleep(time),就是让程序睡一定的时间,时间到了就会自动唤醒,使得程序具备运行资格;二是wait(),就是让程序等待,只有通过notify()来主动唤醒程序,使得程序有运行资格。有运行资格的程序,也会有两个方向,一是直接运行,二是因为cpu某一时间段只运行一个程序,这些有运行资格但是还没有轮到执行权的程序,就会在另一种状态,称为阻塞状态。最后一种,就是线程执行完毕,就会消亡,消亡也是一状态。看图例:

 

 


四、创建线程的第二种方法

方法步骤为:

1、  定义类实现Runnable接口。注意和原来继承Thread不同。

2、  覆盖Runnable接口中的run方法,将线程要运行的代码存放在该run方法中。接口中有一个run方法,我们定义的类中也要吧run方法复写。

3、  通过Thread类建立线程对象。Runnable并不能实现Thread类的功能,只有Thread类的功能才能建立线程。

4、  将Runnable接口的子类对象,最为实际参数传递给Thread类的构造函数。为什么呢?因为,自定义的run方法所属的对象时Runnable接口的子类对象,所哟要让线程去指定指定对象的run方法,就必须明确该run方法所属的对象。

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

示例程序如下:

classTicket implements Runnable//extendsThread {

         public void run(){

         }

}

classTestForYou {

         public static void main(String[] args){

         Ticket t  = new Ticket();

         Threadt1 = new Thread(t);

         t1.start();

}

需要强调的是,一、Runnable接口的子类,没有start方法,不能建立线程而如果光有Thread建立的对象,线程是可以建立的,但是运行的run方法时Thread本身的,对于我们来说没有意义。二、只有Thread的类和其子类可以建立线程,所以才把Runnable接口的子类对象传入,是Thread线程建立时,可以调用我们要运行的run方法。

 

 

既然有两个线程建立方式,那么总结一下:

1)  一个是实现方式,一个是继承方式。

2)  实现方式避免了单继承的局限性。因为编程中,我们定义的子类可能会因为需要已经继承了另一个父类,而子类中也有我们需要的同步执行的代码,那么java中单继承规则的存在,使得不能使用直接继承Thread类的方式创建新线程。这就用到了实现方式,实现Runnable接口,间接的增加的程序的拓展性。

3)  在使用上,一般建立线程使用实现方式,因为更有拓展性,接口也可多实现。

4)  注意两者的区别,继承方法中,线程代码存放于Thread子类的run方法中;实现方法中,线程代码存放于Runnable接口子类的run方法中。

5)   

YOLO11改进-注意力-引入自调制特征聚合模块SMFA SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。 阅读详情

相关推荐

vivado 编译ADI AD9361 TCL脚本生成hdl工程

(4)输入"source ../../scripts/adi_make.tcl"命令(仅双引号内部命令,不包含双引号),个人理解:该命令用来加载当前所需要编译工程所需要各功能模块的信息,因为每个工程需要不同的功能模块,比如有的需要gpio模块,有的不需要gpio模块,这些模块上前面路径的library也同样以TCL脚本形式存在,当有需要时才进行编译,怎么知道当前工程需要什么模块呢就是通过"source ../../scripts/adi_make.tcl"(仅双引号内部命令,不包含双引号)命令实现。

weixin_40586423的博客 808

黑马程序员--读写字节数组,随机读写流,集合IO的思维导图,多线程部分,单例设计模式,线程和进程的概念,Java中的线程的创建方式,线程的随机性,线程的状态图,多线程操作共享数据的安全性,死锁

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------ 1.      第二十三天回顾目录删除,复制,File类的方法,递归,IO流的配合。打印流对象,PrintWrtier,构造方法任意的输出流对象,不会出异常,开启自动刷新,构造方法中的是输出流,如果是、File,或者是String参数,包装成流对象,println,printf,form

yangsing0的专栏 870

破解雪球网acw_sc__v2加密与无限debugger反爬策略

本文详细解析了雪球网的反爬机制,重点破解了其核心的acw_sc__v2加密参数与无限debugger反调试策略。通过实战案例,从抓包分析、逆向调试到算法还原,提供了完整的Python代码实现,帮助开发者掌握应对类似加密反爬的通用方法。

weixin_29207533的博客 1898

多线程(黑马程序员学习笔记)

本文是黑马程序员Java视频教程的学习笔记,重点介绍了进程、线程及其在Java中的实现方式。进程是系统资源分配的基本单位,具有独立性、动态性和并发性;线程是进程中的任务执行单元,多线程能提高执行效率。Java中开启线程的方式包括继承Thread类、实现Runnable接口和实现Callable接口,分别适用于不同场景。文章还详细讲解了线程的常用方法,如获取线程名称、线程休眠、设置优先级和守护线程等。此外,探讨了线程安全问题及解决方案,如同步代码块、同步方法和Lock锁,并介绍了死锁的产生条件及避免方法。

A2294249395的博客 1636

解决rt-thread上使用SPI+DMA

首先阐述下遇到的问题 使用SPI读取icm20602数据,读取频率为1000hz,使用stm32f407主控,发现CPU占用率达到了70%,将此线程注释掉后CPU占用率掉到25%,看来这里要着重优化,便萌生了使用DMA的想法。 使用SPI+DMA要进行的配置 1.开启RTT设备驱动。点击自己的工程 ->RT-Thread Setting2.在board.hzhong3.在board.c文件里加入以下函数,此函数受设备框架调用 void HAL_SPI_MspInit(SPI_HandleTypeDef

响望的博客 8086

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 179

【C++学习汇总】【黑马程序员】

【C++】【第一篇】【黑马 p84 - p105 】【引用】【重载】【类和对象-struct、class】【C++】【第二篇】【黑马 p106~p126】【类对象的构造、解析、深浅拷贝】【this和const使用】【友元】【运算重载符】【C++】【第三篇】【黑马 p127 - p146 】【类对象的继承】【多态】【文本、二进制文件读写操作】【C++】【第四篇】【黑马 p147 ~ p166】C++学习记录之职工管理系统【C++】【第五篇】【黑马 p167~p184】【模板】【函数模板】【类模板】【C++】【

qq_45954434的博客 2696

Windows 11 下 WSL 离线安装 Ubuntu 22.04 保姆级教程(国内镜像加速版)

本文提供了一份针对中国地区用户的Windows 11下WSL离线安装Ubuntu 22.04的详细教程。通过使用国内镜像源加速下载安装包,并配合PowerShell命令完成部署,有效解决了官方商店下载缓慢的问题。教程涵盖环境准备、离线包获取、安装初始化及安装后的关键优化配置,帮助用户快速搭建高效的Linux开发环境。

weixin_28452161的博客 1378

黑马程序员总结文档汇总

这篇日志,是这些日子以来观看传智播客视频写的一篇汇总文档,蓝色标识的超链接是doc类型的文档,绿色标识的超链接是思维导图类型的文档,同时两种类型的文档中每篇都提供了文档下载链接,详细内容如下:   黑马程序员 01 Java基础教学 - 01 - 认识Java                                黑马程序员 02 Java基础教学 - 02 - 走进Java

kongbeily的专栏 2143

基于学术研究于NASA官网GPM卫星数据下载详细教程

基于学术研究于NASA官网GPM卫星数据下载详细教程

珞瑜的博客 8655

1. BES2700ZP概述

恒玄BES2700采用RTX5操作系统,配合mindmics算法或者自研算法。

雪飞_海 4468

Java黑马程序员-多线程笔记

哔哩哔哩java黑马视频笔记

luohanisme的博客 1458

“EXB文件的格式和编程“

首先,打开文件并读取文件头,然后解析文件头中的元数据信息。接下来,循环读取数据块,每次读取块头部分,解析块的大小和类型,并读取相应大小的块数据。文件头(Header):EXB文件通常包含一个文件头,用于存储关于文件的元数据信息。读取EXB文件时,首先需要解析文件头,以了解文件的属性和数据结构。总结起来,EXB文件是一种常见的二进制数据文件格式,在编程中处理EXB文件需要了解其基本结构和元数据信息。通过以上代码,您可以根据自己的需求扩展处理其他类型的数据块,或者根据EXB文件的具体规范进行解析和处理。

HackCyberX的博客 1535

黑马程序员——多线程原来是这么简单

http://software.intel.com/zh-cn/blogs/2011/12/16/400009328/?cid=sw:prccsdn2110 黑马程序员——多线程原来是这么简单

拾贝者 745

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

黑马程序员_多线程

多线程的基础知识

weixin_51429898的博客 1323

蓝牙模块HM-10手册

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

多线程(黑马程序员)

newCachedThreadPool():线程数量随任务增加而增加,只想完毕60s挂掉。newFixedThreadPool(int ):创建固定数量线程池(挂了补充)newSingleThreadExecutor:创建单个线程线程池(挂了补充)参数六:threadFactory:指定线程池的线程工厂(创建线程)参数七:handler:指定线程池的任务拒绝策略(都满了怎么处理)参数二:maximumPoolSize:指定线程池最大线程数量。参数四:unit:临时线程存活时间单位(秒,分,时,天)

weixin_74390886的博客 1430

黑马程序员 Java 最新教程:开启你的编程之旅

黑马程序员 Java 最新教程:开启你的编程之旅 【下载地址】黑马程序员Java最新教程 黑马程序员 Java 最新教程欢迎来到黑马程序员的 Java 最新教程资源页面 项目地址: https://gitcode.com/Reso...

gitblog_06512的博客 617

黑马程序员——多线程

黑马程序员--多线程 ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、定义 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径或叫控制单元。 线程:进程中的一个独立的控制单元。线程在控制着进程的执行。 一个进程中至少有一个线程。 二、多线程作用 优点:多任务共同进行,防止后任务在一定

mh2015cool的博客 425

黑马程序员——Java多线程

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------

tansuozhe1990的博客 628

黑马程序员_Java多线程

-------    android培训、java培训、期待与您交流! ----------

bearzw的博客 757

黑马程序员——多线程-整理笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 多线程的概念:           首先介绍什么是进程:进程是正在执行的程序,每个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元           线程是其实就是进程中一个独立的控制单元,线程在控制着执行,一个进程至少有一个线程。 线程和进程的不同:  

nanfp的博客 1170

黑马程序员——多线程笔记

------- android培训、java培训、期待与您交流! ---------- 一、概念 进程:正在运行中的程序。一般在任务管理器中可以看到有很多正在执行的程序。CPU在快速的切换执行这些进程,CPU在一个时刻只执行一个进程 线程:就是进程中的独立控制单元,控制程序的运行。一个进程肯定至少有一个线程,当线程执行完后,这个进程(程序)也就执行完了 多线程:就是一个进程里面有两个以上的

weizhilin046的博客 657

黑马程序员—面试结束,24期我来啦!(经验分享)

文章来源:黑马程序员,黑马论坛 下午的时候吴老师面的我,然后分数刚刚出来,面试41.7分,总分108.3,哈哈,被录取应该没问题了吧~~~黑马24期,我来啦~~~ 其实面试前还是很紧张的,在屋子里拿着自己打印出来的复习资料转悠半天。然后提前五分钟掐着表Q了老师,等老师给我回复,那个忐忑啊{:soso_e101:} 其实我心里是觉得自己复习的还不错,但是这玩意真不好

heima_28的专栏 3158

黑马程序员—多线程

---------------------- android培训、java培训、期待与您交流! ----------------------     日志完成于11年12月19日          开通了优快云博客才知道三天后才能发表文章,所以趁着这段时间自己就赶紧把自学的知识好好地整理了一下!禁期一解,就可以展现自己的劳动成果了!现在进入正题......     之前在自学“多

yu77ruguo的专栏 515
上一篇: 黑马程序员_String类及StringBuffer和StringBuilder概述和功能、基本数据类型
下一篇: 黑马程序员_多线程(线程安全和通信)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值