Java多线程学习(一)

多线程学习(二):http://t.csdnimg.cn/Q8Koc

目录

1、什么是多线程

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

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

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

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

Thread提供的常用的线程方法


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()让调用当前这个方法的线程先执行完

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day46-http和www基础1

Day46-http和www基础1 1. 用户访问网站基本流程2. DNS系统解析基本流程3. DNS功能4. DNS树形结构介绍5. DNS解析流程(核心)6. 查看生产【授权DNS】并设置解析7. dig查看实际DNS解析8. 企业要不要搭建DNS服务器?9. HTTP协议10. HTTP协议版本11…

Kubernetes 编排系统

Kubernetes 编排系统 Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种灵活而强大的方式来管理容器化应用程序的生命周期,包括自动化部署、扩展、负载均衡、故障恢复等功能…

16、技巧之九: 修改参数,如何让表格翻页滚动到底部?【Selenium+Python3网页自动化总结】

1、问题提出 在网页配置参数时,输入参数名称搜索,搜出来的同名参数结果有多个,分布在一个表格的不同行,表格是动态加载的,需要滚动鼠标才能把所出参数找出来。用selenium怎么实现这种参数修改? 2、网页元素…

计算机网络 |内网穿透

其实内网穿透,也挺好玩的,如果在大学的时候,那个时候讲计算机网络的老师能横向延展,估计课也会更有趣不少,本来计算机网络这门课就是计算机课程中可玩性最搞的。 只能说,怪可惜的 回到正题,内网…

知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会

在区块链技术的风起云涌和Web3生态的蓬勃发展中,知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit(),此次大会将为全球区块链开发者及业…

计算机网络——物理层(数据交换方式)

计算机网络——数据交换方式 提高数据交换方式的必要性电路交换电路交换原理电路交换的阶段建立阶段通信阶段和连接拆除阶段 电路交换的优缺点报文交换什么是报文报文交换的阶段报文交换的优缺点 分组交换分组交换的阶段分组交换的优缺点 数据交换方式的选择数据报方式数据报方…

相机拍照与摄影学基础

1.相机拍照 相机可能形状和大小不同,但基本功能相同,包括快门速度、光圈和感光度,这些是摄影的通用概念。即使是一次性相机也是基于这三个理念工作的。不同类型相机在这三个概念上的唯一区别是你可以控制这些功能的程度。这三个参数被称为相…

【ESP32接入国产大模型之MiniMax】

1. MiniMax 讲解视频: ESP32接入语言大模型之MiniMax MM智能助理是一款由MiniMax自研的,没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司,一直致力于进行大模型相关的研究。 随着人工智能技术的不断发展,自然语…

基于opencv的图像处理系统的设计与实现

概要 随着计算机技术的飞速发展,图像技术在各领域的研究和应用日渐深入和广泛。opencv是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像处理。本文旨在对opencv进行一个快速全面简介,通过介绍图像处理的相关函数,使读…

(一)、机器人时间同步方案分析

1、是否有必要进行时间同步 目前的自动驾驶系统包括 感知、定位、决策规划、控制 等模块,这些模块的正常运行需要依靠各种不同类型的传感器数据的准确 融合。尤其是激光雷达与相机这两种传感器在感、知定位模块中起着至关重要的作用。机械式旋转扫描激光雷达本身较低…

web canvas系列——快速入门上手绘制二维空间点、线、面

文章目录 ⭐前言⭐基本用法💖设置一个 canvas 2D 上下文💖绘制矩形常用方法属性💖绘制一个红蓝交替的矩形 💖绘制路径常用方法属性💖画一个点💖画一条线💖画一个三角形面💖画一个笑脸…

Rust 程序设计语言学习——所有权

这一节主要来学习 Rust 语言的其他特性,所有权、引用与借用、Slice 类型。 1 所有权 Rust 的核心功能(之一)是所有权(ownership)。虽然该功能很容易解释,但它对语言的其他部分有着深刻的影响。 所有程序…

Explain 关键字

优质博文:IT-BLOG-CN explain关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的。分析查询语句或表结构的性能瓶颈。执行语句:explain SQL语句。表头信息如下: 一、ID 参数 select 查询的序列号&…

MySQL实现事务隔离的秘诀之锁

在MySQL中,有多种锁类型,我们先了解三种概念的锁,以便对接下来的内容有更好理解。 表级锁(Table Lock):对整个表加锁,其他事务无法修改或读取该表的数据,但可以对其他表进行操作。页…

【数据结构和算法初阶(C语言)】二叉树铺垫--栈帧的创建与销毁--细节全解

前言: 学习这么久以来,可能有很多疑问:局部变量怎么创建的?为什么局部变量的值是随机的?函数是怎么传参的?传参的顺序是怎么样的?形参和实参是什么样的关系?函数调用是怎么做的&…

由浅到深认识C语言(11):结构体

该文章Github地址:https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn…

【全开源】JAVA情侣扭蛋机情侣游戏系统源码支持微信小程序+微信公众号+H5

一、功能介绍 会员功能、情侣扭蛋 收到的券、送出的券 合伙代理、意见反馈 我们技术使用JAVA后台服务 前后端分离 springbootmybatisplusmysql 用户端 uniapp(vue语法)管理后台 vueelementUi 适配小程序H5公众号,一套源码,无…

Jenkins 面试题及答案整理,最新面试题

Jenkins中如何实现持续集成与持续部署? Jenkins通过自动化构建、测试和部署应用程序来实现持续集成与持续部署(CI/CD)。这个过程包括以下步骤: 1、源代码管理: Jenkins支持与多种版本控制系统集成,如Git、…

设计模式在芯片验证中的应用——装饰器

一、装饰器模式 装饰器模式(Decorator)是一种结构化软件设计模式,它提供了一种通过向类对象添加行为来修改类对象的方法,而不会影响同一类的其它对象行为。该模式允许在不修改抽象类的情况下添加类功能。它从本质上允许基类代码对不可预见的修改具有前瞻…

SQLiteC/C++接口详细介绍之sqlite3类(十二)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十一) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十三) ​37.sqlite3_load_extension 用于在SQLit…