[Java、Android面试]_11_线程的启动方式和区别

文章目录

    • 1. 继承Thread类
    • 2. 实现Runnable接口
    • 3. 实现Callable接口
    • 4. 使用Executor框架
    • 4. 四者的区别

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。
整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注+收藏

1. 继承Thread类

1.class MyThread extends Thread {
2.    public void run() {
3.        // 线程的执行逻辑
4.    }
5.}
6.public class Main {
7.    public static void main(String[] args) {
8.        MyThread thread = new MyThread();
9.        thread.start(); // 启动线程
10.    }
11.}

2. 实现Runnable接口

1.class MyRunnable implements Runnable {
2.    public void run() {
3.        // 线程的执行逻辑
4.    }
5.}
6.
7.public class Main {
8.    public static void main(String[] args) {
9.        MyRunnable myRunnable = new MyRunnable();
10.        Thread thread = new Thread(myRunnable);
11.        thread.start(); // 启动线程
12.    }
13.}

3. 实现Callable接口

1.public class MyThread implements Callable<String>{//Callable是一个泛型接口
2. @Override
3. public String call() throws Exception {//返回的类型就是传递过来的V类型
4. 		for(int i=0;i<10;i++){
5.   		System.out.println(Thread.currentThread().getName()+" : "+i);
6.  	}
7.  	return "Hello Tom";
8. }
9. public static void main(String[] args) throws Exception {
10.  	MyThread myThread=new MyThread();
11.  	FutureTask<String> futureTask=new FutureTask<>(myThread);
12.  	Thread t1=new Thread(futureTask,"线程1");
13.  	t1.start();
14.  	System.out.println(futureTask.get());
15. }
16.}

4. 使用Executor框架

1.import java.util.concurrent.Executor;
2.import java.util.concurrent.Executors;
3.public class Main {
4.    public static void main(String[] args) {
5.        Executor executor = Executors.newFixedThreadPool(2); // 创建线程池
6.        executor.execute(() -> {
7.            // 线程的执行逻辑
8.        });
9.    }
10.}

4. 四者的区别

1)实现Runnable/Callable接口相比继承Thread类的优势
· 适合多个线程进行资源共享
· 可以避免java中单继承的限制
· 增加程序的健壮性,代码和数据独立
· 线程池只能放入Runable或Callable接口实现类,不能直接放入继承Thread的类

2)Callable和Runnable的区别
· Callable重写的是call()方法,Runnable重写的方法是run()方法
· call()方法执行后可以有返回值,run()方法没有返回值
· call()方法可以抛出异常,run()方法不可以
· 运行Callable任务可以拿到一个Future对象,表示异步计算的结果 。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果

3)使用 Executor 框架更灵活,它可以更好地管理线程池、调度任务、控制线程生命周期等。这种方式通常更适合于大规模多线程应用。

在这里插入图片描述

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

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

相关文章

DXP学习2- 绘制电气图【实验】

目录 一、实验目的 二、实验原理 1、创建一个新的项目文件。 2、新建原理图文件 3、设置原理图选项 4、放置元器件 5、其他电路元素的放置 6、对所有电路元素属性参数值的修改 三、实验设备 四、实验内容 1、绘制实验图2-1 元器件所在位置&#xff1a; 1&#xff0c;…

炒伦敦金大师级的交易技术

交易中的反身性由投资大师索罗斯提出&#xff0c;简单来说&#xff0c;它所描述的是投资者与市场之间那种奇妙的互动和互相影响的关系。大家可以把伦敦金市场趋势&#xff0c;想象成一个很大的舞台&#xff0c;它会影响和决定投资者的心理预期和决策。 而投资者的心理预期和决策…

【C++】Qt:WebSocket客户端示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍WebSocket客户端示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

k8s-kubectl命令详解、Pod创建过程、Pod的生命周期、定制Pod、资源对象文件

集群管理 一、如何管理集群 kubectl是用于管理Kubernetes集群的命令行工具 二、语法格式&#xff1a; kubectl [command] [TYPE] [NAME] [flags] command&#xff1a;子命令&#xff0c;如create&#xff0c;get&#xff0c;describe&#xff0c;delete type&#xff1a;…

redis集群数据一致性如何保证?

一般的做法是对key进行hash&#xff0c;比如有4台机器&#xff0c;就对4取模。 这样的坏处是增加或者减少机器的时候&#xff0c;会有大量数据进行迁移。 业界做法是用一致性哈希算法&#xff0c;将机器节点的ip值&#xff0c;对一个很大的数取模比如2^32&#xff0c; 用一个…

Prometheus 配置Basic auth认证

官方配置说明&#xff1a; Basic auth | Prometheus 一、生成密码加密串 Prometheus于2.24版本&#xff08;包括2.24&#xff09;之后提供Basic Auth功能进行加密访问&#xff0c;在浏览器登录UI的时候需要输入用户密码&#xff0c;访问Prometheus api的时候也需要加上用户密…

优质的短效HTTP代理具备什么优点?

随着网络时代的蓬勃发展&#xff0c;数据的获取与处理成为了企业决策和市场竞争的关键。在这场数据的角逐中&#xff0c;优质的短效HTTP代理脱颖而出&#xff0c;备受业界瞩目。优质的短效HTTP代理&#xff0c;提供了稳定的网络连接和匿名性&#xff0c;更为数据采集提供了关键…

Echarts组件初步封装

一、业务场景&#xff1a; 最近在vue中使用echarts时 有多处需要用到各种图表&#xff0c;想着自己封装一个便于多次复用 为了避免大家走弯路&#xff0c;为大家整理了一下&#xff0c;粘走可以直接用的那种 二、具体实现步骤&#xff1a; 1、先在终端安装echarts npm install…

管理类联考–复试–英文面试–问题--规划介绍原因做法--纯英文版

借鉴 https://www.bilibili.com/video/BV1Dk4y187zN/?p4&spm_id_from333.880.my_history.page.clickhttps://www.bilibili.com/video/BV1Dk4y187zN/?p4&spm_id_from333.880.my_history.page.click https://ttsreader.com/zh/https://ttsreader.com/zh/ 规划 视频版…

一文掌握Java动态代理的奥秘与应用场景

一、基本概念 为某个对象提供一个代理&#xff0c;以控制对这个对象的访问。代理类和委托类有共同的父类或父接口&#xff0c;这样在任何使用委托类对象的地方都可以用代理对象来替代。代理类负责请求的预处理、过滤、将请求分派委托类处理、以及委托类执行完请求后的后续处理。…

中国软件评测中心发布《健康软件安全白皮书》,美创参编分享方案实践

日前&#xff0c;中国软件评测中心网络安全和数据安全研究测评事业部发布《健康软件安全白皮书》研究成果&#xff0c;美创科技深度参与此次白皮书编写工作&#xff0c;针对健康软件目前面临的安全风险&#xff0c;分享数据安全建设思路。 白皮书详细剖析健康软件面临的网络和数…

盲盒抽卡机小程序:探索神秘盲盒,尽享抽卡乐趣

在盲盒文化的热潮中&#xff0c;盲盒抽卡机作为一种深受大众喜爱的娱乐形式&#xff0c;正逐渐成为市场上的新宠。为了满足广大盲盒爱好者和抽卡玩家的需求&#xff0c;我们积极投身于盲盒抽卡机小程序的开发&#xff0c;旨在通过创新的技术手段&#xff0c;为用户带来全新的盲…

PyTorch出现:RuntimeError: An attempt has been made to start a new process...报错

1.查看显卡&#xff1a; 第一步&#xff1a;同时按下键盘的winr键&#xff0c;输入cmd 第二步&#xff1a;随后输入 nvidia-smi 2.查看下载安装的包&#xff1a; conda list conda list 3.问题报错 PyTorch出现&#xff1a;RuntimeError: An attempt has been made to …

解决vue3中刷新浏览器页面的axios请求状态变为canceled

最近在开发中要加一个悲观锁的功能&#xff0c;具体需求是&#xff1a;用户1和用户2不能同时打开一个模型进行编辑&#xff0c;用户1优先进入模型后&#xff0c;要对该模型进行上锁&#xff0c;关闭该模型或刷新页面时要进行解锁&#xff0c;此时在刷新页面时出现了问题。 刷新…

线上linux服务器升级nginx

一个nginx版本空包 一个pcre文件 一个zlib文件 ./configure配置文件 make编译 make install复制所有文件到nginx 如果nginx -v无版本号 检查环境变量cat /etc/profile 编辑 环境变量vi /etc/profile 按i进入编辑模式 按esc进入查看模式 因为path中并未使用%JAVA_HOME%字样…

力扣---全排列---回溯

思路&#xff1a; 递归做法&#xff0c;一般会有visit数组来判断第 i 位是否被考虑了。我们先考虑第0位&#xff0c;再考虑第1位&#xff0c;再考虑第2位...dfs函数中还是老套路&#xff0c;先判定特殊条件&#xff0c;再从当下的角度&#xff08;决定第 j 位是哪个元素&#x…

Docker 应用部署

MySQL部署 需求 在 Docker 容器中部署 MySQL &#xff0c;并通过外部 mysql 客户端操作 MySQL Server 。 步骤 1. 搜索mysql镜像 docker search mysql 2. 拉取mysql镜像 docker pull mysql:5.6 3. 创建容器&#xff0c;设置端口映射、目录映射 事先在/root目录下创建m…

VScode手动安装vsix格式插件,提示安装插件与code版本不兼容问题

问题描述: vscode手动按装插件提示"插件不兼容code版本 原因方案:修改安装包内的package.json文件中的版本号与vscode版本号对应即可 解决步骤 以(adpyke.codesnap-1.3.4.vsix)安装包为例 手动安装vscode弹出 无法安装扩展“adpyke.codesnap-1.3.4”&#xff0c;它与 …

每周一算法:迭代加深A*

题目链接 AcWing 180. 排书 题目描述 给定 n n n 本书&#xff0c;编号为 1 ∼ n 1\sim n 1∼n。 在初始状态下&#xff0c;书是任意排列的。 在每一次操作中&#xff0c;可以抽取其中连续的一段&#xff0c;再把这段插入到其他某个位置。 我们的目标状态是把书按照 1 ∼…

提高企业员工生产力的办法

在现代商业环境中&#xff0c;提高企业员工生产力是企业持续发展的关键因素之一。员工生产力的提升不仅有助于企业提高运营效率&#xff0c;还能增强企业的市场竞争力。那么&#xff0c;如何有效地提高企业员工生产力呢&#xff1f;本文将就此问题进行探讨。 一、引入先进技术软…