Java 创建线程的方式

Java——》创建线程的方式 Java中的线程本质上就是一个Thread对象。 创建线程常用方式: 1. 继承Thread类,重写run方法 2. 实现Runnable接口 3. 实现Callable接口 4. 线程池 阅读详情

​Java 创建线程的方式 创建Thread 创建 线程 多线程 三种方式 创建多线程

 

                                                                                         微信公众号

 

                                                    王皓的GitHub:https://github.com/TenaciousDWang

       创建一个Java线程有三种方法,第一种:继承Thread类,第二种实现Runnable接口,第三种实现callable接口。

 

       第一种创建MyThread类继承Thread类,重写run方法,run方法中为该线程所要执行的逻辑。

 

 

       创建一个ThreadTest类使用main方法创建MyThread线程,命名为thread0,这里我们也打印一下主线程的ID号,Java采用的是单线程模型,如过不主动创建线程,将只有一个主线程执行任务,需要注意在JVM中并不是只有一个线程,还会存在例如垃圾回收器这样的线程在跑。

 

 

       创建完线程后,我们使用start方法来启动线程,注意这里是使用start方法而不是调用我们重写的run方法,如果使用run方法,则跟我们正常调用类中方法没有区别。我们来运行一下main方法,得到如下结果。

 

 

       第二种方法,实现Runnable接口,相对于第一种方式,推荐第二种,第一种方法使用继承方式不符合里氏代换原则(Liskov Substitution Principle LSP),实现Runnable接口可以使接口更灵活,对外暴露的细节比较少,使我们更能专注于实现线程的run()方法上。

 

        

       由于Runnable就是一个函数式接口:他只有一个方法run()方法。

 

 

       根据JDK8新特性,我们这里先用lambda表达式写一下。以前的写法如下,大家也可以对比一下。

 

 

       运行得到的结果是一样的。

 

       第三种实现Callable接口,一下所述都来自于java.util.concurrent包(JUC)。我们来看一下call()方法,这个方法与run方法的定义差不多,但是相对于前两种方法,执行call()方法可以获得返回值,弥补了前两种方法执行完成后,无法直接获取执行结果,需要借助共享变量获取的缺陷,使用Callable与Future则可以很好的解决了这个问题。

 

 

       可以看到,这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。其次我们看到call()方法可以直接抛出异常,而Runnable只能通过setDefaultUncaughtExceptionHandler()的方式才能在主线程中捕获子线程中的异常,使用方法可以参考这篇文章中该方法的具体的用法https://blog.youkuaiyun.com/u013256816/article/details/50417822。

 

       callable一般情况下是配合ExecutorService来使用的,这里面提供了三个重载方法,我们只说常用的两个方法。

 

与

        

       我们看到这两个方法都返回一个Future对象,Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

 

 

       五种方法,作用分别是(感兴趣也可以看源码的注释)。

 

  1. cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

 

  1. isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
  2. isDone方法表示任务是否已经完成,若任务完成,则返回true;
  3. get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
  4. get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

 

 

        由于Future<V>是个接口,我们无法直接使用,JDK为我们提供了

FutureTask<V>实现RunnableFuture<V>,RunnableFuture<V>继承了Runnable,与Future<V>。

 

 

       FutureTask是Future接口的一个唯一实现类,提供了2个构造器。

 

 

       接下来我们来看一下如何使用,首先我们先创建一个MyCallable类,并重写call()方法,返回值与接口泛型一致为Integer。

 

 

       创建一个CallableTest,在main方法中创建线程池提交callable,并获得结果,注意get方法是阻塞式的,我们在控制台打印一些信息来观察。

 

        

       以下是控制台打印结果。

 

 

   最后,如果没有返回值可以可以声明 Future<?> 形式类型,返回null即可。

 

【Java用法】关于线程的创建方式,已知全网最全面的总结,七种创建线程的方式 关于创建线程的方式,属于基础的面试问题,一定要能够回答全哈,不过呢平时我们也会经常遇到,所以还是希望把这向种创建线程的方式全部记下来。 阅读详情

相关推荐

java编写的一个多线程程序,模拟银行排队

java编写的一个多线程程序,模拟银行排队.-prepared in a multithreaded process that simulates the bank queue.

Java多线程的创建

ThreadTest1类。ThreadTest2类。ThreadTest3类。MyRunnable类。MyCallable类。

SU_mu147的博客 2162

告别手动输入!用Access批量导入307种土壤数据到SWAT模型(附完整MDB操作流程)

本文详细介绍了如何利用Microsoft Access批量导入307种土壤数据到SWAT模型,显著提升数据录入效率。通过解析usersoil表结构、提供Access操作指南和VBA自动化脚本,帮助环境工程师避免手动输入错误,实现高效数据管理。文章还包含性能优化技巧和常见错误解决方案,是SWAT模型用户的实用指南。

weixin_28366053的博客 324

一篇文章带你搞定 Java 中多线程的实现(Thread,Runnable)

Java 中要想实现多线程代码有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable 接口 开发工程中,建议使用 Runnable 接口实现多线程 文章目录一、继承 Thread 类二、实现 Runnable 接口三、Thread 类和 Runnable 接口 一、继承 Thread 类 Thread 类是在 java.lang 包中定义的,一个类只要继承了 Thread 类,...

南淮北安的博客 1206

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 293

达梦数据库与sharding-jdbc的深度适配实践

本文详细介绍了达梦数据库与sharding-jdbc的深度适配实践,包括驱动与依赖管理、核心适配实现、注册与配置等关键步骤。通过扩展shardingSphere的方式,成功实现了达梦数据库的分库分表功能,并提供了常见问题解决方案和性能优化建议,助力企业级应用高效处理海量数据。

weixin_30300225的博客 623

java 创建5个线程_Java创建线程的三种方式

1.继承Thread 类,创建线程类 ,调用start方法启动 (单一继承 )public class Test1 extendsThread {@Overridepublic voidrun() {System.out.println("test1 run");}public static voidmain(String[] args) {Test1 test1=newTest1();test...

weixin_39719042的博客 524

构建高可用CephFS NFS网关:NFS-Ganesha与RADOS集群的深度整合

本文详细介绍了如何构建高可用的CephFS NFS网关,通过NFS-Ganesha与RADOS集群的深度整合,实现高效文件共享。文章涵盖核心架构、部署实战、性能调优及避坑指南,帮助用户解决Ceph客户端兼容性问题,提升存储访问效率。特别强调高可用设计,确保服务稳定性,适用于金融、电商等高要求场景。

weixin_26976635的博客 254

【 java 多线程】创建多线程的方式四:使用线程池创建多线程

今天我们来大概写一写最后一种创建多线程的方式,也是我们开发中最常用的方式,对于线程池这一块知识点很多,本博客大概写一写线程池的使用,暂时不会深入!

阿牛的博客 1688

Linux初级介绍之番外篇:Linux挂载windows中的共享目录

挂载windows共享目录Windows端共享权限设定解禁Guest设置共享目录权限Linux挂载端扫描共享目录挂载共享目录遇到错误的解决方案 Windows端共享权限设定 解禁Guest 右击我的电脑选择管理–>本地用户和组–>在用户项中双击Guest用户–>取消账号已禁用选项 设置共享目录权限 右击共享目录点属性–>在共享页面中点击共享选项–>下拉选择共享对象为Everyone–>点击共享按钮 3.设置本地策略 打开命令框–>输入secpol.msc–&gt

m0_53497201的博客 228

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

Java线程池并发执行多个任务

Java在语言层面提供了多线程的支持,线程池能够避免频繁的线程创建和销毁的开销,因此很多时候在项目当中我们是使用的线程池去完成多线程的任务。 Java提供了Executors 框架提供了一些基础的组件能够轻松的完成多线程异步的操作,Executors提供了一系列的静态工厂方法能够获取不同的ExecutorService实现,ExecutorService扩展了Executors接口,Executo

超威半导体 3万+

SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem

Linux Ubuntu环境下对SD卡分区(烧写uboot,kernel,及filesystem) 介绍dd命令的使用,SD卡分区、格式化、复制文件等 fdisk命令

weixin_42408707的博客 5056

java 创建线程的三种方式、创建线程池的四种方式

概要: java创建线程的三种方式: 继承Thread类创建线程类 实现Runnable接口 通过Callable和Future创建线程 java创建线程池的四种方式: newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程 newFixedThread...

SmileTimLi的博客 4万+

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 180

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA创建线程的方式

java 创建线程 线程池

weixin_44254397的博客 1319

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java创建线程的4种方式

在Java中,创建线程有多种方式,每种方式都有其适用场景和优缺点。

m0_56341622的博客 3208

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 线程创建方式

文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 本篇文章主要是记录Java线程的几种创建方式,以便需要的时候用来参考 一、创建方式说明 Java线程的创建方式有3种,分别是继承Thread,实现Runnable接口,通过Callable和Future接口创建(JDK1.5中开始增加)。还是有一种说法创建线程方式有4种,这4种除了前边提出的3种以外还有一种是通过线程池的方式创建线程。 二、继承Thread方式 1.代...

lcgskycby的博客 1108

Java创建线程的三种方式

一、继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代 表了线程要完成的任务。因此把run()方法称为执行体。 (2)创建Thread子类的实例,即创建了线程对象。 (3)调用线程对象的start()方法来启动该线程。 二、通过Runnable接口创建线程类 (1)定义runnable接口的实现类,并重写该接口的r...

weixin_43560292的博客 7582

Java中创建线程方式

在Java中创建线程有几种常见的方式,每种方式在不同的场景下有各自的优缺点,下面详细介绍几种创建线程的方式,并讨论它们的适用场景、优缺点以及相关的线程管理概念。

qq_45906596的博客 844

java创建线程的几种方式

和Runnable接口类似但又不一样,Callable接口提供了一个call()方法来作为线程的执行体,call()方法比run()方法功能要更加强大,call()方法可以有返回值,也可以声明抛出异常(前两种如果要抛异常只能通过try,catch来实现)。追踪线程池的源代码,其实用线程池创建线程的本质最终也是使用 new Thread(target) 方法创建的线程,只是将创建的这些线程放入一个池子中进行管理了。方法:1.新创建Callable接口的实现类,并实现call()方法。

没有所谓的命运,只有不同的选择! 958

Java创建线程有几种方式

【代码】Java创建线程有几种方式。

NiuBi6666的博客 884

Java 中创建线程的几种方式

继承Thread类:适用于简单的任务,代码简单,但不够灵活。实现Runnable接口:适合复杂的任务逻辑,线程和任务解耦,灵活性较高。使用Callable和:适合需要返回结果或需要线程池管理的任务。使用线程池创建:适合多线程并发的场景。

萌萌白白的博客 640

Java 线程创建的四种方式

Java 线程创建的四种方式 所有测试用例使用的是 jdk8 ,版本不同可能会有所不同,建议自己亲手试试。 Thread 方式 通过继承Thread类来创建新的线程(不推荐)。示例如下: 创建类 public class ThreadDemo extends Thread { private Logger logger = LoggerFactory.getLogger(ThreadDemo.class); @Override public void run() {

weixin_44457062的博客 2540

Java 创建线程池有哪些方式?

/ 1. 配置线程池参数// 使用有界队列(容量 10),避免 OOM// 自定义线程工厂(设置线程名,便于调试)// 拒绝策略:让提交任务的线程执行// 2. 创建线程池unit,workQueue,handler// 3. 提交任务i < 20;i++) {System.out.println("任务 " + taskId + " 由线程 " + Thread.currentThread().getName() + " 执行");try {})

weixin_43521001的博客 913
上一篇: Java 并发编程与多线程概念
下一篇: ​Java 线程的生命周期 Thread类的使用
JavaBoy王皓
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值