当前位置: 首页 > ds >正文

Java 中创建线程主要有三种方式

在 Java 中,创建线程主要有三种方式,每种方式各有特点和适用场景。以下是详细说明和代码示例:


1. 继承 Thread

原理:自定义类继承 Thread 并重写 run() 方法,通过调用 start() 启动新线程。
特点:简单直接,但 Java 是单继承,无法再继承其他类。

class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程运行: " + Thread.currentThread().getName());}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动新线程(非阻塞)System.out.println("主线程继续执行");}
}

2. 实现 Runnable 接口

原理:实现 Runnable 接口的 run() 方法,将实例传递给 Thread 对象。
特点:更灵活(可继承其他类),推荐使用(避免单继承限制)。

class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程运行: " + Thread.currentThread().getName());}
}public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start(); // 启动新线程// 或使用 Lambda 简化(Java 8+)new Thread(() -> System.out.println("Lambda 线程")).start();}
}

3. 实现 Callable 接口 + FutureTask

原理:实现 Callablecall() 方法(可返回结果和抛出异常),配合 FutureTask 获取返回值。
特点:支持返回值、异常处理,适用于需要结果的多线程场景。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "线程返回值: " + Thread.currentThread().getName();}
}public class Main {public static void main(String[] args) throws Exception {FutureTask<String> futureTask = new FutureTask<>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();String result = futureTask.get(); // 阻塞获取返回值System.out.println(result);}
}

关键注意事项

  1. 启动线程必须调用 start() 而非 run()

    • start():JVM 创建新线程并异步执行 run()
    • run():仅在当前线程同步执行方法(不会启动新线程)。
  2. 线程生命周期
    新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked)→ 终止(Terminated)。

  3. 推荐使用 RunnableCallable
    更灵活,符合面向接口编程原则,适合线程池管理。

  4. 线程池(高级用法)
    实际开发中建议使用线程池(如 ExecutorService),避免频繁创建/销毁线程开销:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(() -> System.out.println("线程池任务"));
executor.shutdown(); // 关闭线程池

三种方式对比

方式优点缺点
继承 Thread简单直接无法继承其他类
实现 Runnable灵活、可扩展无返回值
实现 Callable支持返回值和异常需配合 FutureTask 使用

根据需求选择合适的方式,优先推荐 RunnableCallable

http://www.xdnf.cn/news/12189.html

相关文章:

  • Fast-dLLM:为扩散大模型按下加速键
  • 关于项目多语言化任务的概述
  • Manus AI 现在可以生成短片了
  • 电镀机的阳极是什么材质?
  • Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法
  • 道可云人工智能每日资讯|人工智能赋能广西生态环境保护计划发布
  • JavaWeb:前端工程化-TS(TypeScript)
  • 鸿蒙任务项设置案例实战
  • 离散化思想
  • 链路聚合+VRRP
  • python入门(1)
  • 【.net core】【watercloud】树形组件combotree导入及调用
  • Visual Studio C++ 调试日志与异常定位指南
  • 时序替换实时?是否必要
  • 第16届蓝桥STEMA真题剖析-2025年4月13日Scratch初/中级组
  • OurBMC技术委员会2025年二季度例会顺利召开
  • Java创建多线程的四种方式
  • 使用osqp求解简单二次规划问题
  • 四元数:从理论基础到实际应用的深度探索
  • NNLM和word2vec的区别
  • 2025年文件加密软件推荐,最新款文档加密系统排名
  • (C++)STL:vector的认识与使用全解析
  • 70°视场+亚兆赫兹切换!硅光芯片上的「激光万花筒」登《Nature》封面
  • RDMA简介3之四种子协议对比
  • 基于AI的智能简历筛选系统开发实战
  • 时间复杂度与空间复杂度分析
  • 一站式直播工具:助力内容创作者高效开启直播新时代
  • 基于cnn的通用图像分类项目
  • django之请求处理过程分析
  • 应用层协议:HTTP