Java中创建线程的四种方式的最佳实践

 更新时间:2025年08月19日 08:20:16   作者:David爱编程  
这篇文章主要为大家详细介绍了Java中创建线程的四种方式的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一句话结论

能不用 new Thread() 就别直接用;企业级项目首选线程池,避免资源耗尽与管理混乱。

一、方式一:继承 Thread 类

示例

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("任务执行:" + Thread.currentThread().getName());
    }
}

public class Demo {
    public static void main(String[] args) {
        new MyThread().start();
    }
}

特点

优点:实现简单,直接继承并重写 run() 方法。

缺点:

  • Java 单继承限制,无法再继承其他类。
  • 任务和线程强耦合,任务不能复用。
  • 线程创建和销毁开销大。

结论:只适合入门学习,生产代码中几乎不用。

二、方式二:实现 Runnable 接口

示例

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("任务执行:" + Thread.currentThread().getName());
    }
}

public class Demo {
    public static void main(String[] args) {
        new Thread(new MyRunnable()).start();
    }
}

特点

优点:

  • 任务与线程解耦,可以复用 Runnable 对象。
  • 避免单继承限制,更灵活。

缺点:

run() 无返回值,无法获取执行结果。

结论:实际项目常用,但当需要返回值或异常处理时局限性明显。

三、方式三:实现 Callable 接口 + Future

示例

import java.util.concurrent.*;

class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() {
        return 42;
    }
}

public class Demo {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Integer> future = executor.submit(new MyCallable());
        System.out.println("结果:" + future.get());
        executor.shutdown();
    }
}

特点

优点:

  • call() 方法有返回值,可以抛出异常。
  • 搭配 FutureCompletableFuture 支持异步编排。

缺点:

相比 Runnable 更复杂,需要 ExecutorService 配合。

结论:适合需要获取结果或异常处理的异步任务。

四、方式四:使用线程池(Executor 框架)

示例

ExecutorService pool = Executors.newFixedThreadPool(4);

for (int i = 0; i < 5; i++) {
    pool.execute(() -> System.out.println(Thread.currentThread().getName() + " 执行任务"));
}

pool.shutdown();

特点

优点:

  • 资源复用:避免频繁创建/销毁线程。
  • 任务调度:队列 + 拒绝策略,适合高并发场景。
  • 灵活扩展:可自定义核心线程数、最大线程数、存活时间、队列。

缺点:

  • 使用不当可能导致队列堆积、拒绝任务或 OOM。
  • 需配合监控与合理参数配置。

结论:企业级项目首选,尤其是高并发系统。

五、四种方式对比表

方式返回值灵活性使用难度适用场景
继承 Thread简单学习/测试
Runnable简单一次性异步任务
Callable + Future中等需要结果/异常处理
线程池可选(Future)很高较高生产环境标准方案

六、工程实践建议

禁止直接 new Thread,无法控制线程数量,容易耗尽资源。

避免 Executors 提供的快捷工厂方法(如 newFixedThreadPool),因其参数不透明,可能造成隐患。推荐显式使用 ThreadPoolExecutor 构造函数,明确核心参数与拒绝策略。

推荐使用 Callable + 线程池,既能拿到返回值,也能进行任务调度与统一管理。

务必优雅关闭线程池,否则可能引发内存泄漏或服务无法退出。

七、小结

  • 继承 Thread:入门。
  • Runnable:任务解耦,轻量。
  • Callable:有返回值,实用。
  • 线程池:工程实践必选,结合 Future/CompletableFuture 更强大。

到此这篇关于Java中创建线程的四种方式的最佳实践的文章就介绍到这了,更多相关Java创建线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解如何迁移IntelliJ IDEA的配置插件目录

    一文详解如何迁移IntelliJ IDEA的配置插件目录

    这篇文章主要给大家介绍了关于如何迁移IntelliJ IDEA的配置插件目录,指导用户将默认配置目录(config/system)从C盘迁移到其他盘,通过修改idea.properties文件、创建新目录结构、复制文件夹并验证操作,需要的朋友可以参考下
    2025-05-05
  • Java中 log4j日志级别配置详解

    Java中 log4j日志级别配置详解

    这篇文章主要介绍了Java中 log4j日志级别配置详解,需要的朋友可以参考下
    2018-01-01
  • Servlet虚拟路径映射配置详解

    Servlet虚拟路径映射配置详解

    这篇文章主要介绍了Servlet虚拟路径映射配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 老生常谈设计模式之动态代理

    老生常谈设计模式之动态代理

    下面小编就为大家带来一篇老生常谈设计模式之动态代理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Springboot如何去掉URL后面的jsessionid

    Springboot如何去掉URL后面的jsessionid

    这篇文章主要介绍了Springboot如何去掉URL后面的jsessionid,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Springboot整合SpringSecurity实现登录认证和鉴权全过程

    Springboot整合SpringSecurity实现登录认证和鉴权全过程

    这篇文章主要介绍了Springboot整合SpringSecurity实现登录认证和鉴权全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java全面分析面向对象之封装

    Java全面分析面向对象之封装

    或许大家都听说过java是纯面向对象语言,面向对象思想也就是我们常说的OOP,我们听说最多的思想就是继承,封装,多态,今天我们来讲一讲封装
    2022-04-04
  • JVM生产环境调优实战案例讲解

    JVM生产环境调优实战案例讲解

    这篇文章主要介绍了JVM生产环境调优实战,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-04-04
  • 记一次Feign中实现传实体Bean的问题

    记一次Feign中实现传实体Bean的问题

    这篇文章主要介绍了记一次Feign中如何传实体Bean的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot Maven打包如何根据环境排除文件

    SpringBoot Maven打包如何根据环境排除文件

    文章介绍了在SpringBoot项目中,根据不同的环境(开发、测试、生产)进行JSP文件打包处理的方法,通过配置`pom.xml`文件中的``标签,可以实现开发环境保留`index.jsp`文件,测试环境和生产环境排除该文件
    2024-12-12

最新评论