首页 > 其他分享 >线程的创建有哪些方式?各有什么特点?

线程的创建有哪些方式?各有什么特点?

时间:2024-12-30 22:41:39浏览次数:7  
标签:异步 Runnable Thread 各有 哪些 接口 任务 线程

继承 Thread:简单易用,但灵活性差。
实现 Runnable 接口:灵活性高,适合资源共享。
使用 Callable接口配合 FutureTask:支持返回结果和异常处理,适合需要任务结果的场景。
使用线程池:高效管理线程资源,适合处理大量短生命周期任务。
使用 CompletableFuture:底层依然依赖于线程池。支持链式调用和组合多个异步任务,适合复杂的异步编程场景。

无论有多少种形式,创建多线程的真正的方法,其实只有两种:

继承 Thread 类

实现 Runnable 接口

其它形式都是这两种方式的变体。

常见的多线程的实现方法及其特点

继承Thread类

流程

  1. 定义一个类继承自Thread类,并重写run()方法。
  2. 创建该类的对象,并调用其start()方法启动新线程。

特点:

  • 简单易用:直接继承 Thread 类并重写 run() 方法即可。
  • 局限性:由于 Java 不支持多继承,继承 Thread 类后无法再继承其他类。
  • 适用场景:适合简单的线程任务。

实现 Runnable 接口

流程

  1. 定义一个类并实现Runnable接口的run()方法。
  2. 创建该类的对象,并将其作为目标传递给一个Thread类的实例。
  3. 调用Thread实例的start()方法启动新线程。

特点:

  • 灵活性:实现 Runnable 接口后,类还可以继承其他类。
  • 资源共享:多个线程可以共享同一个 Runnable 实例。
  • 适用场景:适合需要资源共享或需要继承其他类的场景。

使用 Callable 接口配合 FutureTask

流程

  1. 定义一个类并实现Callable接口的call()方法。
  2. 创建一个FutureTask对象,将Callable实例作为参数传入。
  3. FutureTask对象作为目标传递给一个Thread类的实例,并启动线程。
  4. 通过FutureTask对象的get()方法获取异步计算的结果。

特点

  • 支持返回结果和异常处理,适合需要任务结果的场景。
  • 使用 Callable接口限定的功能 + Future接口限定的功能 = 汇总各个线程执行结果 最终执行汇总操作的这一步会被阻塞,直到前面各个线程完成了计算。
  • 类兼具 RunnableFuture接口的功能,并方便地将两种功能组合在一起。

关于 FutureTask 类的使用有如下建议:

  • 在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成
  • 当主线程将来需要时,就可以通过 Future 对象获得后台作业的计算结果或者执行状态
  • 一般 FutureTask 多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
  • 仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get() 方法
  • 一旦计算完成,就不能再重新开始或取消计算
  • get() 方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常
  • get() 只执行一次,因此get() 方法放到最后

使用线程池

流程

  1. 创建一个线程池(如通过 Executors 工具类)。
  2. 创建一个实现 RunnableCallable 接口的任务类。
  3. 将任务提交给线程池执行(如使用 execute()submit() 方法)。
  4. 线程池会自动管理线程的创建、执行和销毁。
  5. 如果是 Callable 任务,可以通过 Future 对象获取任务结果。
  6. 任务执行完成后,关闭线程池。

特点:

  • 资源管理:线程池可以管理线程的生命周期,减少创建和销毁线程的开销。
  • 任务队列:线程池可以处理大量任务,超出线程数的任务会被放入队列等待。
  • 适用场景:适合需要处理大量短生命周期任务的场景。

使用 CompletableFuture(Java 8+)

CompletableFuture 本身不是线程池,但它依赖于线程池来执行异步任务。

流程

  1. 使用 CompletableFuture 的静态方法(如 runAsyncsupplyAsync)创建异步任务。
  2. 如果是 supplyAsync,定义任务并返回结果;如果是 runAsync,定义任务但不返回结果。
  3. 任务默认提交到 ForkJoinPool.commonPool() 执行,也可以指定自定义线程池。
  4. 通过 CompletableFuture 的方法(如 thenApplythenAccept)定义任务完成后的回调操作。
  5. 如果需要,调用 join()get() 方法等待任务完成并获取结果。

特点:

  • 异步编程CompletableFuture 提供了更强大的异步编程能力,支持链式调用和组合多个异步任务。
  • 适用场景:适合复杂的异步任务处理场景。

标签:异步,Runnable,Thread,各有,哪些,接口,任务,线程
From: https://www.cnblogs.com/spiropentadiene/p/18642636

相关文章

  • 开发过程中,使用哪些工具可以监控数据库连接池状态?
    监控数据库连接池状态可以使用以下工具:JMX(JavaManagementExtensions):JMX是一种标准的Java技术,用于监控和管理应用程序。许多Java应用服务器和数据库连接池(如HikariCP、TomcatJDBC)都内置了JMX支持。通过JMX,可以实时监控连接池的状态,如活动连接数、空闲连接数、等待连......
  • Linux查找当前整个系统每个进程的线程数
    工作中经常遇到这样的问题:某台服务器的CPU使用率飙升,通过top命令查看是某个程序(Java)占用的CPU比较大,需要查询Java各个进程下的线程数数量。可以通过以下一组命令组合实现:forpidin$(ps-ef|grep“java”|grep-vgrep|awk'{print$2}');doecho${pid}>/tmp/a.txt;ca......
  • 申请国外专利需要考虑哪些因素
    企业开拓海外市场时,需要考虑如何保护创新成果。常见手段包括专利保护和商业秘密保护,那么如何判断本企业的创新成果适不适合申请海外专利加以保护呢?1.判断创新成果被仿制的难度大不大如果一项创新成果研发难度不高,或者被仿制的可能性大,尽早申请专利是更好的选择。这样可以对......
  • 非煤矿山算法智慧矿山一体机关于云平台应用对远程监控的好处有哪些?
    在当今数字化时代,视频云平台技术的应用正在深刻改变着远程监控领域。它不仅提高了监控系统的效率和可靠性,还为用户带来了前所未有的便利性和灵活性。以下是视频云平台应用在远程监控中的主要优势,以及矿山智能视频分析技术如何为矿山安全监管带来革命性的变化。1、集中化管理视......
  • 4.4.1版本已上线!快来看看山海鲸又有哪些新变化
    产品更新概览功能优化:优化连接API时存在的部分问题;优化了鲸孪生的性能。功能修复:修复数据库密码带部分特殊符号时存在连接失败的问题;修复TDengine数据库在Win11、Linux、MacOS上无法使用的问题。功能优化在山海鲸可视化4.4.1版本软件更新中,我们对数据连接以及鲸孪生方面进......
  • AI智能分析视频分析网关: 视频分析系统在大数据时代面临哪些技术挑战?
    在大数据时代,视频分析系统正面临着前所未有的技术挑战,这些挑战不仅涉及数据处理和分析的技术层面,还涉及法规合规等多个维度。随着技术的发展,视频分析系统需要更加智能、灵活和高效,以适应不断变化的需求和环境。以下是视频分析系统在当前时代面临的主要技术挑战。1、视频流的高连......
  • 4G无线太阳能视频监控在户外安防领域有哪些应用?
    4G无线太阳能视频监控技术以其环保节能、安装便捷和远程监控的特点,在普通安防领域展现出广泛的应用前景。这项技术通过太阳能光伏板将光能转化为电能,配合4G无线通信技术,实现了在无电网覆盖或电网不稳定地区的稳定供电和视频数据传输。那么4G无线太阳能视频监控在普通安防领域有......
  • 光伏发电监控/4G太阳能无线监控系统的数据传输速度受哪些因素影响?
    太阳能无线监控系统的数据传输速度是确保监控效果和系统可靠性的关键因素。它受到多种因素的影响,包括网络稳定性、带宽和传输速率、延迟和丢包率、安全性等。了解这些影响因素对于优化系统设计和提高数据传输效率至关重要。那么在实际应用中,太阳能无线监控系统的数据传输速度受......
  • SpringBoot中如何使用事务, 有哪些失效的情况
    详细:在方法上添加@Transactional注解来开启事务,有多个可配置选项用于控制事务的行为可指定的配置选项:rollbackFor属性指定事务回滚的规则DEFAULT:使用数据库的默认隔离级别。READ_UNCOMMITTED:允许读取未提交的数据。READ_COMMITTED:只能读取已提交的数据。REPEATABLE_......
  • Vue3最新Router带来哪些颠覆性变化?
    1前后端开发模式的演变jQuery时对大部分Web项目,前端不能控制路由,要依赖后端项目的路由系统。通常,前端项目也部署在后端项目的模板里,项目执行示意图:jQuery前端都要学会在后端模板如JSP里写代码。此时,前端工程师无需了解路由。对每次的页面跳转,都由后端负责重新渲染模板。前端......