Java面试之实现多线程(二)

此篇接上一篇Java面试之什么是多线程(一)

Java多线程是Java语言中的一个重要特性,它可以实现并发处理、提高程序的性能和响应能力。开发者需要了解多线程的概念和机制,并采用合适的多线程编程模型和同步机制,以保证程序的正确性和稳定性。Java提供了多种方式来实现多线程,下面列举了其中几种:

1.继承Thread类。通过继承Thread类并实现run()方法,创建一个线程类,然后通过创建该类的对象并调用start()方法来启动线程。

继承Thread类

2.实现Runnable接口。通过实现Runnable接口并实现run()方法,创建一个线程任务类,然后通过创建Thread对象并传递该任务对象,并调用start()方法来启动线程。

实现Runnable接口

Thread(T)和Runnable(R)

1.T是一个类,R是接口,因为在Java语言里面的继承特性,接口可以支持多继承,而类只能单一继承。所以如果在已经存在继承关系的类里面要实现线程的话,只能实现R接口。

2.R表示一个线程的顶级接口,T类其实是实现了R这个接口,我们在使用的时候都需要实现run方法。站在面向对象的思想来说,R相当于一个任务,而T才是真正处理的线程,所以我们只需要用R去定义一个具体的任务,然后交给T去处理就可以了,这样达到了松耦合的设计目的。

3.接口表示一种规范或者标准,而实现类表示对这个规范或者标准的实现。所以站在线程的角度来说,T才是真正意义上的线程实现。

4.R表示线程要执行的任务,因此在线程池里面,提交一个任务传递的类型是R。

总的来说,T只是实现了R接口并做了扩展,所以这两者站在个人角度认为没什么可比性。

3.实现Callable接口。通过实现Callable接口并实现call()方法,创建一个带返回值的线程任务类,然后通过创建FutureTask对象并传递该任务对象,再创建Thread对象并传递FutureTask对象,并调用start()方法来启动线程。

实现Callable接口

Callable、Future和CompletableFuture

Callable是Java多线程编程中的一个接口,用于实现带返回值的线程任务。与Runnable不同,Callable的call()方法可以返回一个结果,可以使用泛型来指定返回值的类型。在实际应用中,我们可以将Callable任务提交给线程池,或者使用FutureTask来执行并获取任务的返回值。

Future是Java并发编程中的一个接口,用于表示一个异步计算的结果。Future对象可以在计算未完成时获取计算的状态,并在计算完成后获取计算的结果。在Java中,通过Future来获取Callable任务的返回值。

需要注意的是,在使用Future获取结果时,如果任务尚未完成,会阻塞当前线程,直到任务完成为止。因此,在实际应用中,需要根据具体情况来设置超时时间,避免程序长时间阻塞。

CompletableFuture是Java 8中新增的一个基于事件驱动的异步回调类。它继承了Future接口,并提供了更加丰富的异步编程支持。简单来说就是当使用异步线程去执行一个任务的时候,我们希望在任务结束以后触发一个后续动作,而CompletableFuture就可以实现这个功能。相比于Future,CompletableFuture具有以下优点:

1.异步编程更加灵活。CompletableFuture可以通过回调函数(Callback)的方式实现异步编程,而不必像Future那样阻塞等待结果。

2.支持链式调用。通过链式调用的方式,可以更加优雅地组织异步计算任务。

3.提供异常处理机制。CompletableFuture提供了异常处理方法,可以更加方便地处理异步计算过程中可能发生的异常。

4.使用线程池。通过创建线程池来管理和复用线程,减少线程的频繁创建和销毁带来的新能开销,因为线程创建会涉及到CPU上下文切换、内存分配等工作。可以提高程序的性能和效率。(关于线程池的详细内容后面再补充)

使用线程池

5.使用J.U.C并发包中的工具类。Java并发包中提供了许多工具类,如Semaphore、CountDownLatch、CyclicBarrier、Lock、ReadWriteLock等,可以用来实现多线程的同步和协作。(关于AQS的详细内容后面再补充)

使用J.U.C并发包中的工具类

需要注意的是,多线程编程需要特别注意线程安全和同步问题,避免出现死锁、数据竞争等问题。关于多线程安全问题,请关注之后的Java多线程相关内容。



喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

酒店/电影推荐系统里面如何应用深度学习如CNN?

【1】酒店推荐系统里面如何应用CNN?具体过程是什么 在酒店推荐系统中应用卷积神经网络(CNN)并不是一个常见的选择,因为 CNN 主要用于处理具有空间结构的数据,如图像、音频和某些类型的序列数据。然而,在某…

三、nginx实现lnmp+discuz论坛

lnmp l:linux操作系统 n:nginx前端页面 m:mysql数据库,账号密码,数据库等等都保存在这个数据库里面 p:php——nginx擅长处理的是静态页面,页面登录账户,需要请求到数据库&#…

03篇--二值化与自适应二值化

二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…

CV之UIGM之OmniGen:《OmniGen: Unified Image Generation》翻译与解读

CV之UIGM之OmniGen:《OmniGen: Unified Image Generation》翻译与解读 导读:这篇论文介绍了OmniGen,一个用于统一图像生成的扩散模型。 >> 背景痛点:目前的图像生成模型大多专注于特定任务,例如文本到图像生成。…

数据分析python小工具录入产品信息到Excel

在没有后台管理系统的时候,有时候为了方便起见,想提供一个输入框让运营人员直接输入,然后数据就会以数据库的形式存进数据库 效果图: 输入用户名 输入数据 输入信息后点击添加到表格,检查后方便批量保存到excel …

scala的泛型2

package test55 //隐式转换 //1.隐式函数 //2.隐式类 //3.隐式对象 //4.函数的隐式参数//泛型:类型参数化。 //Pair 约定一对数据 class Pair[T](var x:T, var y:T) //泛型的应用场景: //1.泛型函数 //2.泛型类 //3.泛型特质 object test2 {def main(arg…

【刷题22】BFS解决最短路问题

目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图:从A到I,怎样走路径最短 一个队列一个哈希表队列:一层一层递进,直到目的地为止哈希表&…

Google Cloud Database Option(数据库选项说明)

关系数据库 在关系数据库中,信息存储在表、行和列中,这通常最适合结构化数据。因此,它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL(结构化查询语言)。它们为数据提供 ACID 一致性模式&am…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢?1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承?2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

PAT甲级-1114 Family Property

题目 题目大意 共有n个户主,每个户主的房产按照“ 户主id 父亲id 母亲id 孩子个数 孩子的id 房产数 房产面积 ”的格式给出。如果父亲或母亲不存在,值为-1。每个户主及其父亲母亲孩子可以构成一个家庭,不同户主如果有相同的家人,…

如何不重启修改K8S containerd容器的内存限制(Cgroup方法)

1. 使用crictl 查看容器ID crictl ps2. 查看Cgroup位置 crictl inspect 容器ID3. 到容器Cgroup的目录下 使用上个命令就能找到CgroupPath 4 . 到cgroup目录下 正确目录是 : /sys/fs/cgroup/memory/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podf68e18…

《计算机视觉:瓶颈之辩与未来之路》

一、计算机视觉的崛起 计算机视觉是使用计算机模仿人类视觉系统的科学,让计算机拥有类似人类提取、处理、理解和分析图像以及图像序列的能力。它是一个多学科交叉的领域,与机器视觉、图像处理、人工智能、机器学习等领域密切相关。 计算机视觉行业可分为…

Burp suite2 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…

Scala中求汉罗塔游戏

记:f(n,"A","B","C")表示n个盘子从A柱子上移动到C柱子上,借用B柱子的过程 f(要移动的盘子的个数,起点,辅助柱子,终点) 1.基本情况(直接能求的):f(1,"A",&…

mac 安装CosyVoice (cpu版本)

CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址:https://github.com/FunAudioLLM/CosyVoice.git 下载项目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…

C++50道经典面试题

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 作为一种通用且面向对…

家里养几条金鱼比较好?

金鱼,作为备受喜爱的家庭水族宠物,其饲养数量一直是众多养鱼爱好者关注的焦点。究竟养几条金鱼最为适宜,实则需要综合考量多方面因素,方能达到美观、健康与和谐的理想养鱼境界。 从风水文化的视角来看,金鱼数量有着诸…

启明智显ZX7981PC:5G时代的新选择,全屋网络无缝覆盖

在这个飞速发展的5G时代,每一个细微的科技进步都在推动着我们的生活向更加智能、便捷的方向发展。近日,启明智显再次引领科技潮流,正式发布其最新的5G CPE产品——ZX7981PC。作为继7981PG与7981PM之后的又一次迭代升级,ZX7981PC凭…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 ,否则为 0 ) and表示(全为1时才为1,否则为0) and表示(全为1时才为1,否则为0),逻辑或用|或 o r 表示 ( 有 1 就为 1 ,都为 0 才为 0 ) or表示…

讲解如何使用NLTK?外加数据清理实例演示

一、如何使用NLTK? 定义:自然语言工具包(Natural Language Toolkit),它是一个将学术语言技术应用于文本数据集的 Python 库,称为“文本处理”的程序设计是其基本功能,专门用于研究自然语言的语…