四种线程创建方式

article/2025/9/17 0:40:51

一. 继承Thread类

继承Thread类创建线程的步骤:

  • 创建一个自定义类继承Thread类,重写run()方法,将所要单独线程运行写入run()方法中;
  • 创建Thread类的子类的对象;
  • 调用该对象的start()方法,该start()方法表示开启线程,然后调用执行run方法;
 	@Testpublic void test() {Thread.currentThread().setName("主进程");System.out.println("当前线程为:" + Thread.currentThread().getName());//创建一个新线程ThreadDemo thread1 = new ThreadDemo();//为线程设置名称thread1.setName("次线程");//开启线程thread1.start();}class ThreadDemo extends Thread {@Overridepublic void run() {System.out.println("当前线程为:" + Thread.currentThread().getName());}}

二. 继承Runnable接口

实现Runnable接口创建线程的步骤为:

  • 创建一个类并实现Runnable接口(可以使用Lambda表达式)
  • 重写run()方法,将所要单独线程的代码写入run()方法中
  • 创建该类对象,将该对象作为Thread类的构造器参数传入
  • 使用构造器创建对象调用start()方法(运行该线程)
@Testpublic void test() {Thread.currentThread().setName("主进程");System.out.println("当前线程为:" + Thread.currentThread().getName());//创建线程Thread thread = new Thread(() -> {System.out.println("当前线程为:" + Thread.currentThread().getName());});thread.setName("次线程");thread.start();Thread thread1 = new Thread(new ThreadDemo());thread1.setName("次次线程");thread1.start();}class ThreadDemo implements Runnable {@Overridepublic void run() {System.out.println("当前线程为:" + Thread.currentThread().getName());}}

三. 实现Callable接口与创建Future接口实现类对象

实现Callable接口并实现Callable接口

  • 创建一个类并实现Callable接口(可以使用Lambda表达式)
  • 重写call()方法,将所要单独线程执行的代码写进call方法中,需要注意的是call()方法是有返回值的,并且可以抛出异常
  • 如果想要获取运行该线程后的返回值,需要创建Futrue接口的实现类的对象,也就是FutureTask的对象,通过调用该对象的get()方法得到call()方法的返回值
    在这里插入图片描述
  • 使用FutureTask的带参构造器创建对象,并传入实现了Callable接口的类的对象(可以使用Lambda表达式)
  • 使用Thread类的带参构造器创建对象,将FutureTask类的对象作为参数传入,然后调用Thread类的对象的start()方法运行该线程
	@Testpublic void test5() throws ExecutionException, InterruptedException {Thread.currentThread().setName("主进程");System.out.println("当前线程为:" + Thread.currentThread().getName());//创建FutureTaskFutureTask<String> futureTask = new FutureTask<>(() -> {System.out.println("当前线程为:" + Thread.currentThread().getName());return "二级线程";});//创建线程Thread thread = new Thread(futureTask, "次线程");thread.start();System.out.println("当前返回值为:" + futureTask.get());//不使用Lambda表达式FutureTask<String> stringFutureTask = new FutureTask<String>(new ThreadDemo());new Thread(stringFutureTask, "次线程二").start();System.out.println("当前返回值为:" +stringFutureTask.get());}class ThreadDemo implements Callable {@Overridepublic Object call() throws Exception {System.out.println("当前线程为:" + Thread.currentThread().getName());return "二级线程";}}

四. 使用线程池创建

使用线程池创建线程的步骤

  • 使用Executors类中的newFixedThreadPool(int num)方法创建一个线程数量为num的线程池
  • 使用线程池中的execute()方法执行由实现Runnable接口创建的线程,使用submit()方法执行由实现Callable接口创建的线程
  • 调用线程池中的shutdown()方法关闭线程池(只是关闭了获取线程,线程池并未立即死亡,会在执行完被调用的线程后死亡)
 	//实现Runnable接口class ThreadDemo6 implements Runnable {@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ThreadDemo6当前线程为:" + Thread.currentThread().getName());}}//实现Runnable接口class ThreadDemo7 implements Runnable {@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ThreadDemo7当前线程为:" + Thread.currentThread().getName());}}class ThreadDemo8 implements Callable<String> {@Overridepublic String call() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("ThreadDemo8当前线程为:" + Thread.currentThread().getName());return "ThreadDemo8返回的结果:" + Thread.currentThread().getName();}}@Testpublic void test6() throws ExecutionException, InterruptedException {Thread.currentThread().setName("主线程");System.out.println("当前线程为:" + Thread.currentThread().getName());//通过线程池工厂创建线程数量为2的线程池ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.execute(new ThreadDemo6());executorService.execute(new ThreadDemo7());//submit()用于实现Callable接口创建的线程Future<String> task = executorService.submit(new ThreadDemo8());//获取call方法的返回值String result = task.get();System.out.println(result);//关闭线程池executorService.shutdown();}

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

相关文章

创建线程的四种方式

我们创建线程池一般有四种方式&#xff0c;分别是&#xff1a; 1.继承Thread类&#xff0c;重写run()方法&#xff1b; 2.实现Runnable接口&#xff0c;重写run()方法&#xff1b; 3.实现Callable接口&#xff0c;重写call()方法&#xff1b; 4.使用线程池创建线程&#xff1b;…

线程创建常用的四种方式

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…