创建线程的四种方式

article/2025/9/17 1:07:02

我们创建线程池一般有四种方式,分别是:
1.继承Thread类,重写run()方法;
2.实现Runnable接口,重写run()方法;
3.实现Callable接口,重写call()方法;
4.使用线程池创建线程;
本文就介绍下前3种创建线程的方式,第4种使用线程池的方式,大家可以查看下Java之线程池入门

一、继承Thread类

步骤:
1.创建一个类继承Thread类,重写其run()方法,在run()方法中编写需要执行的任务;
2.创建继续Thread类的对象;
3.调用其对象的start()方法,该方法表示启动一个线程,线程处于就绪状态,如果获取到cpu执行权,则会调用run()方法,执行对应的任务;
注意:如果调用run()方法,就是普通的方法调用;
Demo1:

public class ThreadDemo {public static void main(String[] args) {MyThread myThread = new  MyThread();myThread.start();}
}class MyThread extends Thread{@Overridepublic void run() {System.out.println("继承thread类实现线程---");}
}

运行结果:

继承thread类实现线程---

二、实现Runnable接口

步骤:
1.创建一个类,实现Runnable接口,重写run()方法,编写需要执行的代码;
2.创建一个Runnable接口实现类的对象;
3.将此对象作为形参传递到Thread类的构造器中,创建Thread类的对象,调用start()方法,启动线程;
Demo2:

public class ThreadDemo {public static void main(String[] args) {MyThread myThread = new  MyThread();new Thread(myThread).start();}
}class MyThread implements Runnable{@Overridepublic void run() {System.out.println("实现Runnable接口来创建线程---");}
}

运行结果:

实现Runnable接口来创建线程---

继承方式和这种实现接口的方式的联系和区别:
1.联系:public class Thread implements Runnable, 继承Thread 方式中Thread也实现了Runnable接口
在这里插入图片描述
2.实现接口的方式要优先继承方式:

  1. 避免了java只能单个继承的局限性
  2. 如果多个线程要操作同一份资源或者数据,使用实现接口的方式更加合适。

三、实现Callable接口

步骤:
1.创建Callable接口的实现类,并实现call()方法,该方法具有返回值,并且可以抛异常;
2.创建Callable实现类的实例,并使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值;
3.使用FutureTask对象作为Thread对象的target创建并启动新线程;
4.调用FutureTask对象的get()方法来获取子线程执行结束后的返回值;
demo3:

public class ThreadDemo {public static void main(String[] args) {MyThread myThread = new  MyThread();FutureTask<Integer> futureTask = new FutureTask<>(myThread);new Thread(futureTask).start();try {Integer integer = futureTask.get();System.out.println("执行结果:"+integer);} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}
}class MyThread implements Callable<Integer>{@Overridepublic Integer call() throws Exception {System.out.println("实现Callable接口来创建线程---");Integer i = 6/2;return i;}
}

运行结果:

实现Callable接口来创建线程---
执行结果:3

实现Runnable和实现Callable接口的方式基本相同,
不过是后者执行call()方法有返回值,并且可以抛出异常,前者线程执行体run()方法无返回值.

Callable 和 Runnable接口的区别

  1. Callable规定的方法是call(),而Runnable规定的方法是run()。
  2. Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
  3. call()方法可抛出异常,而run()方法是不能抛出异常的。

我们看到Runnable和Callable传到Thread类的构造器中表面上方式是“不一样”的,我们看到Thread类的构造器:
在这里插入图片描述
我们上面使用的都是public Thread(Runnable target)构造器,实现Runnable方式直接将其实现类的对象传入即可;但是实现Callable接口,我们使用的FutureTask来保证实现Callable接口类的对象,在传入Thread构造器中,那FutureTask和Runnable有什么关系呢?

我们点到FutureTask类的源码中可以发现其实现了RunnableFuture接口
在这里插入图片描述
然后继续点进RunnableFuture接口的源码中,我们发现其继承了Runnable接口。
在这里插入图片描述
看到这里不知道大家发现没有,上面三种方式都和Runnable接口有联系;Thread类是实现Runnable,Callable封装成FutureTask,FutureTask实现RunnableFuture,RunnableFuture继承Runnable,所以Callable也算是一种Runnable,所以三种实现方式本质上都是Runnable实现。


http://chatgpt.dhexx.cn/article/ExMH8Ver.shtml

相关文章

线程创建常用的四种方式

java中创建线程的四种方法以及区别 Java使用Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程&#xff0c;如下所示&#xff1a; 1&#xff09;继承Thread类创建线程 2&#xff09;实现Runnable接口创建线程 3&…

银行测试核心项目之测试阶段分享

最近有小伙伴说「想了解核心系统建设中&#xff0c;冒烟、SIT、UAT、回归测试的重点&#xff0c;如何设计测试案例&#xff0c;或相关的资料推荐等」。 这个话题很笼统&#xff0c;测试这一块儿除了业务测试&#xff0c;还有性能测试、安全测试等&#xff1b;以及不同的角色对…

金融银行测试面试题分享

1、网上银行转账是怎么测的&#xff0c;设计一下测试用例。 回答思路&#xff1a; 宏观上可以从质量模型&#xff08;万能公式&#xff09;来考虑&#xff0c;重点需要测试转账的功能、性能与安全性。设计测试用例可以使用场景法为主&#xff0c;先列出转账的基本流和备选流。…

2022年软件测试——精选金融银行面试真题

前言 小伙伴们好久不见呀&#xff0c;现已经到了八月份了过了这一个月就是金九银十了&#xff0c;在这里呢笔者给大家准备了一份软件测试金融方面的面试题&#xff0c;笔者在这里就不多说废话了哟&#xff0c;咱们直接进入正题哈。 1、P2P你们也测试后台管理吗&#xff1f;个人…

金融行业软件测试

金融行业软件测试 一、什么是金融行业二、金融行业的业务特点1. 金融行业的业务特点 三、金融行业测试主要测试范围1. 功能测试2. 业务验证测试3. 客户端测试4. 接口测试5. 性能测试6. 安全性测试 四、金融行业软件测试的现状五、第三方测试的优点 一、什么是金融行业 金融业是…

走出新手村,软件测试银行项目怎么测试 + 面试题(答案)

前言 业务&#xff1a; 银行类app具体模块业务讲解&#xff1a; 掌上生活&#xff08;消费/理财&#xff09; 消费&#xff1a; 与电商平台业务类似 饭票&#xff1a;GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

【工作总结】银行软件测试工作总结

最近换工作进入到外包公司&#xff0c;驻点到银行进行集成测试工作&#xff0c;为了让自己更熟悉金融行业&#xff0c;特别是银行业相关业务&#xff0c;以及总结自己测试的一些经验&#xff0c;希望将自己了解和学习的内容记录下来。主要从以下几个方面学习&#xff1a; 一、…

大咖or学员?金融银行软件测试案例分享!

2019年4月14日汇智动力学院在成都校区开展了本年度的第一次线下技术交流沙龙&#xff08;银行金融测试方向&#xff09;&#xff1b; 刘德宝老师做技术分享 通过在上个月末举办的老学员周末娱乐活动&#xff08;雀圣大赛&#xff09;&#xff0c;我们做了一系列的问卷调查&…

银行软件测试面试问题

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#x…

浦发银行软件测试面试真题(小编面试亲测)

对于想要面试去银行面试的小伙伴们看过来&#xff0c;今天为大家总结了浦发银行的面试题&#xff0c;其实很多面试题很多公司都差不多。主要看自己如何灵活回答。以下的问题小编盆友之前面试非浦发银行的银行项目也有被问到过&#xff0c;是在一面的时候被问到的。答案仅作为参…

金融银行软件测试超大型攻略,最受欢迎的金融银行大揭 秘附面试题

零、为什么做金融类软件测试 举个栗子&#xff0c;银行里的软件测试工程师。横向跟互联网公司里的测试来说&#xff0c;薪资相对稳定&#xff0c;加班少甚至基本没有&#xff0c;业务稳定。实在是测试类岗位中的香饽饽&#xff01; 一、什么是金融行业 金融业是指经营金融商…

银行软件测试简历模板,找工作的小伙伴看过来了

目录 目录 个人简历 教育背景 工作经历 自我评价 专业技能 ​编辑 个人简历 姓  名&#xff1a; 性  别&#xff1a; 学  历&#xff1a; 经  验&#xff1a; 手  机&#xff1a; 邮  箱&#xff1a; 政治面貌&#xff1a; 意向岗位&#xff1a; 软…

7个银行的软件测试项目实战,别再说简历项目不知道怎么写了

目录 前言 项目描述1&#xff1a;上海华瑞银行直连票据项目 项目描述2&#xff1a;平安金服风控中台系统 项目描述3&#xff1a;众安创展APP项目 项 目4&#xff1a; 招商银行VTM自助渠道服务系统 项 目5&#xff1a;招商银行票据支付 项 目6&#xff1a; 平安银行风控系…

银行测试——软件测试永远的神

为什么要做金融类软件测试 举个例子&#xff0c;比如银行的软件测试工程师&#xff0c;横向和互联网公司的测试人员比较来说&#xff0c;工资比较稳定&#xff0c;加班很少甚至没有&#xff0c;业务稳定。 实在是测试类岗位中的香饽饽&#xff01;【点击文末小卡片免费领取软件…

软件测试之银行项目重点测试点

在我们的日常在金融或银行软件测试工作中都有哪些内容需要测试&#xff1f;在这些测试的内容中如何去更好的掌握测试技能保证测试质量&#xff0c;一起来学习探讨交流。 下面为银行测试点的概括&#xff1a; 根据上图&#xff0c;我们可以从以下几个方面重点关注&#xff1a; …

【软件测试】银行项目,银行测试业务测试,有哪些侧重点?(总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行的软件测试是…

layui-laydate 时间大小控制

开始时间必须小于结束时间&#xff0c;结束时间必须大于开始时间&#xff0c;如图&#xff0c;左边的输入框选定了开始时间&#xff0c;则右边的输入框不能再选择4月11号之前的日期了 关键代码&#xff1a; var start,end; //月份修正 function doneTime(date){return {year: d…

layui中laydate的使用——设置动态时间范围限制、重置时间范围(清空动态限制)

如果使用layui插件&#xff0c;然后在时间设置上&#xff0c;有范围限制的需求时&#xff0c;可以直接使用range&#xff0c;这里主要讲&#xff0c;不用range&#xff0c;而是用两个独立的时间选项&#xff0c;如何做时间范围的控制&#xff01;&#xff01;&#xff01; 目录…

layer之table用法

jsp页面 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <%taglib prefix"shiro" uri"http://shiro.apache.org/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HT…

基于layui的laydate,在加载后台数据时laydate.render()不起作用。

1. 以前有过一次折磨的经历。第一时间没记起来。先看图 1.1 后台数据加载出来的效果 1.2 点击选择时间后弹出日期格式不合法 1.3 合法数据 2. 代码片段 <script type"text/javascript">var layData [ form, laydate ];layui.use(layData, function() {var lay…