Java复习-多线程编程

多线程编程

解决并发访问的问题。

一. 继承 Thread 类实现多线程

1. 继承实现

  1. 继承thread类
    class MyThread extends Thread{}
  2. 覆写run主方法
    多线程要执行的功能都应该在 run() 方法中定义。
class MyThread extends Thread { // 线程的主体类private String title;public MyThread(String title) {this.title = title;}@Overridepublic void run() { // 线程的主体方法// TODO Auto-generated method stubsuper.run();for(int x = 0; x < 10; x++) {System.out.println(this.title + "运行,x = " + x);}}
}
public class ThreadDemo {}
  1. 主程序类之中执行 start() 方法
public class ThreadDemo {public static void main(String[] args) {new MyThread("线程A").start();new MyThread("线程B").start();new MyThread("线程C").start();}
}

2. 源码分析 start() 方法

start() 方法实际上执行的是 run() 方法中的内容,而通过观察 Thread类 源码中的start() 方法的源码,我们发现其中调用了如下的一个方法:
private native void start0(); // 只定义了方法名称,但是没有实现
其中,native 指的是 JNI(Java Native Interface)技术,利用这项技术可以使用操作系统提供的一些底层函数进行一些特殊的处理。
而在 Thread 类中的 start0() 方法就表示需要将此方法的实现依赖于不同的操作系统来实现,即其具体实现细节由java虚拟机(JVM)给出。
在这里插入图片描述

二. 基于 Runnable 接口实现多线程

1. 原因

继承Thread会有单继承的局限,而使用“基于 Runnable 接口实现多线程”可以克服该局限。

2. 接口源码定义

Runnable 中只有一个 run() 方法,因此是函数式接口,可通过Lambda表达式调用。

@FunctionalInterface
public interface Runnable {public abstract void run();
}

3. 接口实现

3.1 正常实现

  1. 实现 Runnable 接口
    class MyThread implements Runnable{}
  2. 覆写 run() 方法
class MyThread implements Runnable { // 线程的主体类private String title;public MyThread(String title) {this.title = title;}@Overridepublic void run() { // 线程的主体方法for(int x = 0; x < 10; x++) {System.out.println(this.title + "运行,x = " + x);}}
}
  1. 作为Thread的参数,借用 start() 方法
    由于 Runnable 接口中并没有start() 方法,因此对于多线程的启动仍然需要使用 Thread 类 针对于 Runnable 的构造方法。
// 源码中 Thread 关于 Runnable 的构造方法
public Thread(Runnable target) {this(null, target, "Thread-" + nextThreadNum(), 0);
}

主程序类中的代码为:

public class ThreadDemo {public static void main(String[] args) {Thread thA = new Thread(new MyThread("线程A"));Thread thB = new Thread(new MyThread("线程B"));Thread thC = new Thread(new MyThread("线程C"));thA.start();thB.start();thC.start();}
}

3.2 利用Lambda实现多进程定义

public class ThreadDemo {public static void main(String[] args) {for (int x = 0; x < 3; x++) {String title = "线程对象:" + x ;new Thread(()->{for (int y = 0; y < 10; y++) {System.out.println(title + "运行,y = " + y);}}).start();}}
}

总结: 以后开发之中对于多线程的实现,优先考虑 Runnable 接口实现,并且永恒都是通过Thread 类对象启动多线程。

三. Thread 和 Runnable 关系

1. 隐含的代理设计模式

在这里插入图片描述
多线程的设计之中,使用了代理设计模式的结构,用户自定义的线程主体只是负责项目核心功能的实现,而所有的辅助实现全部交由 Thread 类来处理。
在进行 Thread 启动多线程的时候调用的是 start()方法,而后找到的是 run() 方法

2. 资源并发访问

多线程开发的本质就是实现多个线程可以进行同一资源的抢占。Thread描述线程(实际项目中的用户),Runnable描述资源。
在这里插入图片描述
范例:利用卖票程序实现多个线程的资源并发访问

class MyThread implements Runnable { // 线程的主体类private int ticket = 5;@Overridepublic void run() { // 线程的主体方法for(int x = 0; x < 10; x++) {if (this.ticket > 0)System.out.println("卖票,ticket = " + this.ticket --);}}
}
public class ThreadDemo {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt).start(); //第一个线程启动new Thread(mt).start(); //第二个线程启动,这并不是同一个线程,而是同一个资源new Thread(mt).start(); //第三个线程启动,通过 new 实例化了三个线程,三个线程传入的Runnable都是mt}
}

在这里插入图片描述

四. Callable 接口实现多线程

Runnable 有一个缺点:当线程结束之后无法获得一个返回值,因此使用可返回值的Callable 接口。

1. 接口源码定义

  • Callable 也是函数式接口,可通过Lambda表达式调用。
  • Callable 其中只有一个 call() 方法,返回一个泛型,此泛型的类型就是返回数据的类型,可以避免由于向下转型所带来的安全隐患。
@FunctionalInterface
public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}

2. Callable 与 Thread 关系分析

在这里插入图片描述

3. 接口实现范例

使用Callable实现多线程处理

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyThread implements Callable <String>{ // 1. 实现 Callable 接口并指出返回值类型// 2. 覆写 call()方法@Overridepublic String call() throws Exception {for (int x = 0; x < 10; x++) {System.out.println("线程执行 x = " + x);}return "线程执行完毕!";}
}
public class ThreadDemo {public static void main(String[] args) throws Exception{// 3. 实例化 FutureTask 类,将线程实现类作为参数传入FutureTask<String> task = new FutureTask<>(new MyThread());// 4. 借由 FutureTask 实例化对象实现 start() 方法new Thread(task).start();// 5. 使用 FutureTask 实例化对象中的 get() 方法获得线程返回值System.out.println("线程返回数据: " + task.get());}
}

4. 面试题: Runnable 与 Callable 的区别?

  • Runnable 是在JDK1.0 的时候提出的多线程的实现接口,而 Callable 是在JDK1.5 之后提出的;
  • java.lang.Runnable 接口之中只提供有一个 run() 方法,并且没有返回值;
  • java.util.concurrent.Callable 接口提供有 call() 方法,可以有返回值。

五. 多线程运行状态

  1. 线程启动用的是 start() ,但此时对应的是“就绪态”;
  2. 当线程处于“运行态”时,会执行 run() 方法。
  3. run() 方法执行结束后,线程进入“结束态”

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

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

相关文章

100道基于Android毕业设计的选题题目,持续更新

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目&#xff0c;以及基于an…

30岁游戏服务端开发者的独立游戏梦想,你不敢想的事他都做了!

小的时候家里就是开电动游戏厅的&#xff0c;所以我从小就喜欢玩游戏&#xff0c;尤其是那些有创意和故事性的游戏。 我梦想着有一天能够制作出自己的游戏&#xff0c;让更多的人享受到游戏带来的乐趣。 为了实现这个梦想&#xff0c;我选择了学习计算机科学&#xff0c;并在毕…

数字化新零售营销模式如何落地?数字化新零售营销功能推荐

​通过科技手段&#xff0c;针对对线下零售店面的客户进行消费行为、频次等的分析&#xff0c;并进一步整合线上线下资源&#xff0c;实现实体零售的效率充分化&#xff0c;便是目前很火的新零售营销模式&#xff0c;能够将实体门店与数字化技术进行有机结合&#xff0c;通过为…

windows安装pytorch

windows安装pytorch 1. 安装cuda pytorch官网我要安装1.12.1对应的cuda有三个版本&#xff0c;我选了11.6 去官网安装这个版本的cuda下载链接 安装后打开命令行输入nvcc -V&#xff0c;可以显示版本则安装成功&#xff0c;如果显示nvcc不是外部命令&#xff0c;进入安装文件…

【个人博客系统网站】我的博客列表页 · 增删改我的博文 · 退出登录 · 博客详情页 · 多线程应用

【JavaEE】进阶 个人博客系统&#xff08;4&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;4&#xff09;1. 增加博文1.1 预期效果1.1 约定前后端交互接口1.2 后端代码1.3 前端代码1.4 测试 2. 我的博客列表页2.1 期待效果2.2 显示用户信息以及博客信息2.2.1…

springboot使用freemarker导出word

springboot使用freemarker导出word 一、需求说明二、制作模板文件1.修改word留下占位符并另存为.xml文件2.将xml文件后缀名改为.ftl3.打开ftl文件格式化内容4.将占位符替换成变量 三、代码实现1.引入依赖2.将模板引入resource下3.编写word导出工具包4.创建接口调用 一、需求说明…

CSS核心使用一

CSS核心使用一 box-sizingbox-shdowtext-shadowpositionwriting-mode box-sizing 定义计算一个元素的总高度和总宽度. 属性值 content-box 默认值,width 内容宽度,height内容的高度border-box 宽度和高度包含内容,内边距和边框 widthborderpadding内容宽度, heightborderpad…

使用亚马逊云科技人工智能内容审核服务,打造安全的图像生成和扩散模型

生成式人工智能技术发展日新月异&#xff0c;现在已经能够根据文本输入生成文本和图像。Stable Diffusion 是一种文本转图像模型&#xff0c;可让您创建栩栩如生的图像应用。您可以通过 Amazon SageMaker JumpStart&#xff0c;使用 Stable Diffusion 模型轻松地从文本生成图像…

H.265 视频在浏览器中的播放问题探究

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

ATF(TF-A) SPMC威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方或接收方FF-A ID 5.2 篡改端点和SPMC之间的…

JavaScript中的Hoisting机制

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript 中的 Hoisting 机制⭐ 变量提升⭐ 函数提升⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xf…

第7章_freeRTOS入门与工程实践之模块使用说明与STM32CubeMX配置

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

SOLIDWORKS Composer反转关键帧实现产品安装过程

SOLIDWORKS Composer 是一款被用来制作交互式产品说明书的工具&#xff0c;可以帮助我们对产品设定精确的机构动画&#xff0c;并能根据材质生成一定细节的渲染图像。 今天我们主要向大家讲解的是&#xff0c;利用SOLIDWORKS Composer关键帧反转实现产品动态的安装。 一般情况下…

cf 交互题

今天cf遇到了交互题&#xff0c;这个交互题的算法很很很简单&#xff0c;但是在交互上卡了&#xff0c;导致交上的代码都不算罚时。&#xff08;更伤心了。 所以&#xff0c;现在写一下交互题的做法&#xff0c;印象深刻嘛。 交互题&#xff0c;就是跟机器进行交互。你代码运…

数据结构——排序算法——希尔排序

希尔排序本质上是对插入排序的一种优化&#xff0c;它利用了插入排序的简单&#xff0c;又克服了插入排序每次只交换相邻两个元素的缺点。它的基本思想是&#xff1a; 1.将待排序数组按照一定的间隔分为多个子数组&#xff0c;每组分别进行插入排序。这里按照间隔分组指的不是…

vscode搭建Django自带后台管理系统

文章目录 一、django自带的后台管理系统1. 建表2. 后台管理系统2.1 创建账号2.2 运行后台2.3 登录 二、模版渲染1. 直接将数据渲染到页面2. 数据传递给js 三、数据库1. 查看当前数据库2. 创建UserInfo数据表3. Django rest framework配置 四、vue前端搭建1. 在Django项目的根目…

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用 kubeadm方式部署 一、测试所需环境&#xff08;三台均要执行&#xff09;二、配置准备&#xff08;三台均要执行&#xff09;1. 重命名hostname、添加hosts2. 关闭防火墙、selinux与swap3. 添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm 三…

yocto stm32mp1集成ros

yocto stm32mp1集成ros yocto集成ros下载meta-rosyocto集成rosrootfs验证 yocto集成ros 本章节介绍yocto如何集成ros系统用来作机器人开发。 下载meta-ros 第一步首先需要下载meta-ros layer&#xff0c;meta-ros的链接如下&#xff1a;https://github.com/ros/meta-ros/tre…

1-4 AUTOSAR方法论

总目录——AUTOSAR入门详解AUTOSAR入门详解目录汇总&#xff1a;待续中。。。https://xianfan.blog.csdn.net/article/details/132818463 目录 一、前言 二、方法论 三、单个ECU开发流程 一、前言 汽车生产供应链上有以下角色&#xff1a;OEM、TIER1、TIER2&#xff0c;其主…

《向量数据库指南》——哪些需求推动了如Milvus Cloud等的向量数据库的更新和迭代?

这个问题需要深入讨论大模型与向量数据库之间的关系。从去年 ChatGPT 推出时这个问题就开始引发我们的思考。在当时,我们敏锐地意识到这将是一个机遇。然而,在国内,这个概念的认知需要更长的时间。我个人在去年四五月份的美国之行中注意到,数据库在美国已经是一个非常热门的…