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

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

相关文章:

  • 洛谷 单源最短路径 Dijkstra算法+优先队列
  • 华为云Flexus+DeepSeek征文|Flexus云服务器单机部署+CCE容器高可用部署快速搭建生产级的生成式AI应用
  • 如何通过RL真正提升大模型的推理能力?NVIDIA提出长期强化学习训练框架ProRL
  • 通过模型文件估算模型参数量大小
  • 数据湖是什么?数据湖和数据仓库的区别是什么?
  • vscode中无法使用npm node
  • STM32的ADC简介
  • 51单片机基础部分——数码管显示
  • 解决idea编译运行项目时间长的问题
  • 【学习笔记】TCP 与 UDP
  • 【映射】2024-睿抗-AcWing 5834. 谁进线下了?
  • go语言的锁
  • echarts使用graph、lines实现拓扑,可以拖动增加effect效果
  • Kafka入门- 基础命令操作指南
  • P1064 [NOIP 2006 提高组] 金明的预算方案——依赖背包
  • k8s热更新-subPath 不支持热更新
  • 界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?
  • 数据结构(7)—— 二叉树(1)
  • 微信小程序动态组件加载的应用场景与实现方式
  • 字节开源FlowGram:AI时代可视化工作流新利器
  • 动漫网站开发毕业设计/2022年今天新闻联播
  • wordpress相关网站/哪家网络推广好
  • 云南SEO网站建设/软文网官网
  • 网站2019建设目标/最近营销热点
  • 企业网站的首页设计/seo整站怎么优化
  • 南京网站制作/开发一个app需要多少钱?