线程创建的三种方式

这篇具有很好参考价值的文章主要介绍了线程创建的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. Thread类

2. Runnable接口

3. Callable接口

4. 线程的生命周期

新建 

就绪

运行

阻塞

等待

结束


1. Thread类

继承Thread类的方式创建线程

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务
  2. 创建Thread类的子类,即创建了线程对象
  3. 调用线程对象的start()方法来创建并启动线程
  4. 线程创建的三种方式

2. Runnable接口

定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体就是线程的线程执行体

创建Runnable接口的实现类,并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象

线程创建的三种方式

3. Callable接口

  1. 创建Callable接口的实现类,并实现call()方法。该call()方法将作为线程的执行体,旦该call()方法有返回值,再创建Callable实现类的实例。
  2. 使用Future Task类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
  3. 使用FutureTask对象作为Thread对象的target创建井启动新线程。
  4. 使用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

线程创建的三种方式

大部分人熟知的都是继承Thread类或实现Runnable接口,但上述两种方式来执行的线程其实都是没有返回值的,如果我们想要通过线程的执行获得一些有用的信息的话,那么通过继承Thread类或实现Runnable接口都是无法办到的。

比如说我们在实现一个商品的详情页的时候,可能需要获取商品的详细信息包括库存信息,商品详情,配送时效,商品评价等等一些信息的时候,如果我们在同一个线程中一次性查询这么多信息,那接口性能就可想而知了。 这个时候我们可能就会想到通过多线程的方式来并发的调用不同的接口,同时获取这些信息。这个时候,就该使用Callable接口来获取对应的返回值了。

当然,我们在真正的开发过程中一般也不会通过实现Callable接口的方式来实现功能,可能更多的是通过线程池来实现,关于线程池的东西我们在后面再来一起看看~~

4. 线程的生命周期

新建 

        new关键字创建线程对象时的状态

就绪

        通过线程对象的start()方法启动线程时对应的状态,此时线程并不一定马上能进入运行状态,线程的运行由操作系统的调度程序控制

运行

        线程获得cpu的执行权,线程正在执行需要执行的代码

阻塞

        BLOCKED称为阻塞状态,或者说线程己经被挂起,它“睡着”了,原因通常是它在等待一个“锁〞

        线程在等待一个“锁”,当尝试进入一个synchronized语句块/方法时,锁己经被其它线程占有,就会被阻塞,直到另一个线程走完临界区或者发生了相应锁对象的wait()操作后,它才有机会去争夺进入临界区的权利。

线程创建的三种方式

线程创建的三种方式 

 如上图可以看出,线程1在进入run方法时,由于线程0持有的锁还未释放,此时线程进入阻塞状态,等待线程0释放锁之后,才重新争夺运行权,从而再次进入运行态。

等待

        分为有限期等待(比如Thread.sleep() )和无限期等待( 比如:没有设置timeout参数的wait() )

结束

        线程结束

 文章来源地址https://www.toymoban.com/news/detail-487373.html

到了这里,关于线程创建的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java面试题】线程创建的三种方式及区别?

    继承Thread类,子类重写run()方法,调用子类的strat()启动线程。 实现Runnable接口,实现run()方法,调用对象start()启动线程。 实现Callable接口,实现call()方法,用FutureTask()封装实现类。使用FutureTask对象作为Thread对象调用start()启动线程,调用FutureTask对象的get()

    2024年02月12日
    浏览(35)
  • 【Java练习题汇总】《第一行代码JAVA》多线程篇,汇总Java练习题——线程及多线程概念、Thread 类及 Runnable 接口、线程状态、synchronized同步操作...

    一、填空题 Java 多线程可以依靠________ 、________ 和________ 三种方式实现。 多个线程操作同一资源的时候需要注意________,依靠________ 实现,实现手段是:________ 和________,过多的使用,则会出现________ 问题。 Java 程序运行时,至少启动________ 个线程,分别是________ 和_

    2024年02月16日
    浏览(38)
  • 多线程之Runnable 、Callable 、Thread

    Java 提供了三种创建线程方法: 通过实现 Runnable 接口; 通过继承 Thread 类本身; 通过 Callable 和 Future 创建线程。 创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类。 为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下: 你可以重写该方法,重要的

    2024年02月07日
    浏览(43)
  • Docker存储目录迁移的三种方式

    背景: 随着docker的使用时间越来越长,导致镜像和容器越来越多,占满了系统盘空间,这时,我们需要给它们搬个家了 下面咱们提供三种方式 docker info :查看docker的存储等相关信息 1、停止docker 服务 2、备份数据到新的存放路径 3、备份 /var/lib/docker 路径 4、创建软连接 5、启

    2024年02月07日
    浏览(49)
  • Java 创建多线程的三种方法

    在Java中创建多线程,往往都要通过Thread类来实现,今天学习下Java中创建多线程的三种方法[1]。 通过继承 Thread类 实现多线程。 主要方法: 1.void run(), 线程开启后,方法将被调用执行 2.void start(), 使此线程开始执行, Java虚拟机会调用run()方法 实现步骤: 1.定义类,继承 Thread类

    2024年02月05日
    浏览(39)
  • Java 多线程实现的三种方式

    Java 多线程实现方式主要有三种:继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、Callable、Future 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承 Thread 类实现多线程 继承 Thread 类的方法尽管被我列为一种多线程

    2023年04月27日
    浏览(40)
  • Java 实现多线程的三种方式

    1、三种方法的介绍和比较 1、1三种方式得介绍 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 1、2三种方法的介绍和比较 1、2、1、实现Runnable接口相比继承Thread类有如下优势 1、增强程序的健壮性,将业务逻辑与线程调度分离 2、线程池只能放入实现Runable或Callable类线程

    2024年02月02日
    浏览(35)
  • Springboot中使用线程池的三种方式

    前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场。 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟。 这里就介绍一下springboot中的多线程的使用,使用线程连接池去异步执行业务方法。 由于代码中包含详

    2024年02月08日
    浏览(36)
  • Spring Boot获取resources目录下的文件的三种方式

    在Spring Boot项目中,经常需要获取 resources 目录下的文件。这些文件可以包括配置文件、模板文件、静态资源等。本文将介绍三种常用的方法来获取 resources 目录下的文件。 ResourceLoader 接口是Spring框架提供的用于加载各种资源的接口,包括 classpath 下的资源。在Spring Boot中,可

    2024年02月16日
    浏览(39)
  • Java创建数组的三种方式

    这种一般用的比较多。 数组类型 [ ]  数组名称  =  new 数组类型 [ 数组长度 ] 

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包