Java多线程学习(一)

1、什么是多线程

进程的执行需要依赖线程。线程是进程的最小执行单位,每一个进程中最少有一个线程。

例如:使用某网盘下载时,当我们同时进行下载和上传操作时(同一时间同时进行),就使用到了多线程,上传是一个线程,下载也是一个线程。

使用聊天软件时,同时在收消息和发消息也用到了多线程。

我们的java程序执行main方法时就是执行了一条线程。

2、如何创建多线程(多个方法)

在java中使用的是java.lang.Thread类的对象来代表线程的。

方法一:继承Thread类创建线程

写一个main方法(main方法是由一条默认的主线程执行的)

新建一个子类MyThread并继承Thread类

在MyThread类中我们需要重写Thread中的run方法,run方法中就是我们需要在新线程中执行的代码

在run方法中我们写上一段测试代码

然后我们在main方法中创建我们的子线程对象,并调用start方法启动我们的子线程

为了对比,我们在main方法中也执行一段测试代码

运行main方法

多次执行后可以发现执行结果顺序是随机的。因为两个线程同时执行,谁先谁后不是固定的。

步骤总结:

(1)创建一个子类MyThread继承Thread类,并且重写run()方法

(2)在main方法中创建MyThread对象

(3)调用start()方法启动线程

注意:

(1)子线程的执行必须调用的是start()方法,而不是run()方法。如果调用run()方法,调用的是子线程中的run()方法,而不是启动线程,则仍然是单线程执行的。

(2)子线程启动必须在主线程任务之前。如果子线程的启动在主线程之后,主线程任务执行完之后才去启动的子线程,没有实现真正的多线程。

优缺点:

(1)编码简单

(2)线程类已经继承了Thread类,无法继承其他类,不利于扩展。

方法二:实现Runnable接口创建线程

步骤:

(1)声明一个MyRunnable任务类实现Runnable接口,重写里面的run()方法。

(2)在main方法中创建MyRunnable任务对象myRunnable

(3)新建一个线程对象,将myRunnable作为参数,调用start()方法即可

优缺点:

(1)优点:任务类只是实现接口,还可以继承其他类,实现其他接口,可扩展性强

(2)缺点:需要多一个Runnable对象

扩展:匿名内部类写法

简化写法1:

简化写法2(lambda表达式):

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

前面两种线程创建方式存在的问题---->线程执行完后有一些数据要返回,重写的run方法都不能直接返回结果

而利用Callable接口、FutureTask类实现的可以返回数据

步骤:

(1)创建任务对象

定义一个类实现Callable方法,重写call方法,封装要执行的代码和返回的数据

将Callable类型的对象封装程FutureTask(线程任务对象)

(2)把线程任务对象交给Thread对象

(3)调用Thread对象的start方法启动线程

(4)线程执行完之后,通过FutureTask对象的get方法获取线程任务执行的结果

优缺点:

(1)优点:线程任务只是实现接口,可以继承和实现其他接口,扩展性强。可以在线程结束后获取结果

(2)缺点:代码复杂一点

Thread提供的常用的线程方法

 

public void run()线程的任务发放
public void start()启动线程
public String getName() 获取当前线程的名称,线程默认名称是Thread-索引
public void setName()为线程设置名称
public static Thread currentThread()获取当前执行的线程对象
public static void sleep(long time)让当前线程休眠多少毫秒后继续执行
public final void join()让调用当前这个方法的线程先执行完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461305.html

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

相关文章

德国法兰克福交易所股票清单列表数据API接口

# Restful API https://tsanghi.com/api/fin/stock/XFRA/list?token{token}更新时间:收盘后3~4小时。 更新周期:每天。 请求方式:GET。 # 测试:返回不超过10条数据(2年历史) https://tsanghi.com/api/fin/…

【Java,Redis】Redis 数据库存取字符串数据以及类数据

1、 字符串存取数据 Resource private StringRedisTemplate stringRedisTemplate;//从Redis中获取string字符串 stringRedisTemplate.opsForValue().get("cache:shop:"id); //Json -> class Shop shop JSONUtil.toBean(ShopJson,Shop.class); //字符串写入redis…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的自动驾驶目标检测系统详解(深度学习+Python代码+PySide6界面+训练数据集)

摘要:开发自动驾驶目标检测系统对于提高车辆的安全性和智能化水平具有至关重要的作用。本篇博客详细介绍了如何运用深度学习构建一个自动驾驶目标检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLO…

什么是VR应急预案演练虚拟化|VR体验馆加盟|元宇宙文旅

VR 应急预案演练虚拟化指的是利用虚拟现实(Virtual Reality,VR)技术进行应急预案演练的过程。在传统的应急预案演练中,人们通常需要在实际场地或模拟环境中进行演练,这可能存在一些限制,如成本高昂、场地受…

解析KafkaConsumer类的神奇之道

欢迎来到我的博客,代码的世界里,每一行都是一个故事 解析KafkaConsumer类的神奇之道 前言KafkaConsumer双线程设计主线程(消费线程):心跳线程:示例代码: KafkaConsumer线程不安全线程安全的替代…

PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数

摘要/导言 本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。 背景/引言 随着电…

非空约束

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 非空约束 所谓的非空约束,指的是表中的某一个字段的内容不允许为空。如果要使用非空约束,只需要在每个列的后面利用“NOT NULL”声明即可 -- 删除数…

Java习题中 哈希表的理论 有效的字母异位词 快乐数 两数之和

关于 哈希表的理论 今天最大的疑惑好像就是map的复杂度怎么算哈哈,一般n个元素map的复杂度就是On哦,不需要想得太复杂了,冲突的空间并不会造成一个量级,改变n前面的常数不会影响空间复杂度哈提醒!熟悉好map,set的API哦 关于 有效的字母异位词 为什么遍历第二个字符…

Linux异步通知实验:应用程序对异步通知的处理

一. 简介 前面文章学习了 应用程序对异步通知的处理方法,另一篇文章实现了Linux驱动对异步通知的处理: Linux应用程序对异步通知的处理-CSDN博客 Linux异步通知实验:驱动中异步通知的处理-CSDN博客 本文继续Linux异步通知实验&#xff0c…

想进阿里?先搞懂Spring Bean作用域!

大家好,我是小米!今天我来和大家分享一下 Java 开发中一项非常重要的技术——参数校验。参数校验在我们的代码中起着至关重要的作用,它能够确保我们的应用程序接收到正确的数据,并且保证了系统的安全性和稳定性。在过去,我们可能会通过繁琐的 if-else 来进行参数校验,但是…

AI视频矩阵混剪系统|罐头鱼AI批量混剪定时发送

AI视频矩阵混剪系统:智能创作与发布的完美结合 随着社交媒体平台的快速发展,视频已成为各行业推广和传播的热门方式。然而,对于许多人来说,制作高质量的视频仍然是一项挑战。Q:290615413但现在,有了AI视频矩阵混剪系统…

lftp服务与http服务(包含scp服务)详解

目录 前言: 1.lftp服务 1.1lftp服务的介绍以及应用场景 1.2安装lftp服务 1.2进行配置 1.3实际操作 2.http服务 2.1http服务介绍以及应用场景 2.1安装httpd服务 2.2进行配置 2.3实际操作 3.scp服务 3.1scp服务的介绍以及应用场景 致谢: 前言: 在当今互联网…

xss.haozi.me靶场“0x0B-0x12”通关教程

君衍. 一、0x0B 实体编码绕过二、0x0C script绕过三、0x0D 注释绕过四、0X0E ſ符号绕过五、0x0F 编码解码六、0x10 直接执行七、0x11 闭合绕过八、0x12 闭合绕过 XSS-Labs靶场“1-5”关通关教程 XSS-Labs靶场“6-10”关通关教程 Appcms存储型XSS漏洞复现 XSS-Labs靶场“11-13、…

CSS学习-选择器

一、基本选择器 1. 通配选择器 作用:可以选中所有的 HTML 元素。 语法: * { 属性名: 属性值; }举例: /* 选中所有元素 */ * { color: orange; font-size: 40px; }主要用于:清除样式。 2. 元素选择器 作用:为页面…

57、服务攻防——应用协议RsyncSSHRDP漏洞批扫口令猜解

文章目录 口令猜解——Hydra-FTP&RDP&SSH配置不当——未授权访问—Rsync文件备份协议漏洞——应用软件-FTP&Proftpd搭建 口令猜解——Hydra-FTP&RDP&SSH FTP:文本传输协议,端口21;RDP:windows上远程终端协议…

多媒体会议系统的优势与核心组成

随着科技的发展,多媒体会议系统已经成为现代商务沟通的重要工具。这种集成了多种通信和信息技术的系统,旨在提高会议的效率和参与度,具有诸多优势。本文将对多媒体会议系统进行详细的介绍和分析,并探讨其对现代商务沟通的影响。 …

Python程序设计基础——代码习题

1 __name__属性 import demodef main():if __name__ __main__:print(这个程序被直接运行。)elif __name__demo:print(这个程序作为模块被使用。) main()3.3 编写程序,生成包含1000个0~100之间的随机整数,并统计每个元素出现的次数。 import randomx[r…

springboot基于java的畅销图书推荐系统

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

📁 前情提要: Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

PFA烧杯透明聚四氟乙烯刻度量杯

PFA烧杯,刻度清晰,耐酸碱,和有机溶剂。