继承Thread类最简但受限于单继承;实现Runnable接口更灵活,推荐日常使用;需返回值时用Callable+FutureTask;生产环境应使用线程池。

直接继承 Thread 类是最简方式,但只能单继承
Java 中创建线程最直观的方法是让类继承 Thread,重写 run() 方法。这种方式适合逻辑简单、无需复用已有类结构的场景。
- 必须调用
start()启动线程,直接调用run()只是普通方法执行,不会开启新线程 - 由于 Java 不支持多继承,若该类已继承其他父类(如
Frame、Activity),就无法再继承Thread - 示例:
class MyThread extends Thread { public void run() { System.out.println("Thread running: " + Thread.currentThread().getName()); } } // 使用 new MyThread().start();
实现 Runnable 接口更灵活,推荐日常使用
把任务逻辑封装进 Runnable 实现类,再传给 Thread 构造器,解耦了「任务」和「执行者」,也规避了单继承限制。
-
Runnable是函数式接口,可用 Lambda 简写:new Thread(() -> System.out.println("Lambda thread")).start(); - 同一个
Runnable实例可被多个Thread复用,适合共享任务场景(如多线程处理队列) - 注意:它没有返回值,也不能抛出受检异常(
Exception),若需结果或异常传播,得换方案
用 Callable + FutureTask 获取线程执行结果
当线程执行后需要返回值或捕获异常时,Runnable 不够用,必须升级到 Callable。
千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使
-
Callable的call()方法可返回泛型结果、抛出异常;而Runnable的run()返回void且不能抛受检异常 - 不能直接传给
Thread,必须包装成FutureTask(它同时实现了Runnable和Future) - 示例:
Callable
task = () -> { Thread.sleep(100); return 42; }; FutureTask ft = new FutureTask<>(task); new Thread(ft).start(); System.out.println(ft.get()); // 阻塞获取结果
线程池才是生产环境的标配,别手写 new Thread()
频繁创建/销毁线程开销大,且无统一管理。JDK 提供的 ExecutorService 是标准解法,底层复用固定线程数,支持队列、拒绝策略、生命周期控制。
立即学习“Java免费学习笔记(深入)”;
- 优先用
Executors工厂方法(如newFixedThreadPool(4)),但注意newCachedThreadPool和newScheduledThreadPool的潜在风险(如无界队列、线程泄漏) - 提交
Runnable或Callable均可:executor.submit(() -> {...})或executor.submit(callable) - 务必调用
shutdown()或shutdownNow(),否则 JVM 可能不退出(守护线程不影响 JVM 终止,但普通线程会)
Runnable + 线程池覆盖 90% 场景;Callable 用于需要结果的异步计算;手写 Thread 子类基本只出现在教学或极简脚本中。别忽略线程复用和资源释放——这才是线上稳定性的关键。









