上一篇
Java如何新建线程?
- 后端开发
- 2025-06-15
- 3622
Java创建线程有两种方式:1. 继承Thread类并重写run方法;2. 实现Runnable接口并作为参数传入Thread构造器,推荐使用Runnable接口,避免单继承限制且更灵活。
继承Thread类
原理:重写run()
方法定义线程任务,通过start()
启动线程。
代码示例:
class MyThread extends Thread { @Override public void run() { System.out.println("线程执行: " + Thread.currentThread().getName()); } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程(JVM自动调用run()) } }
特点:
- 简单直接,适合快速实现
- 单继承限制,无法继承其他类
- 任务与线程绑定,复用性差
实现Runnable接口
原理:实现Runnable
接口的run()
方法,将任务对象作为参数传递给Thread实例。
代码示例:
class MyRunnable implements Runnable { @Override public 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(); } }
特点:
- 解耦任务与线程,实现多继承
- 可复用同一任务对象(如线程池)
- 无返回值,无法抛出受检异常
使用Callable和Future
原理:通过Callable
定义带返回值的任务,结合Future
获取结果或异常。
代码示例:
import java.util.concurrent.*; class MyCallable implements Callable<String> { @Override public String call() throws Exception { return "结果来自: " + Thread.currentThread().getName(); } } public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new MyCallable()); System.out.println(future.get()); // 获取返回值 executor.shutdown(); } }
特点:
- 支持返回值与异常抛出
- 灵活管理异步任务结果
- 需配合线程池使用,代码稍复杂
使用线程池(Executor框架)
原理:通过ExecutorService
管理线程生命周期,避免频繁创建/销毁开销。
代码示例:
import java.util.concurrent.*; public class Main { public static void main(String[] args) { // 创建固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(2); // 提交Runnable任务 executor.execute(() -> { System.out.println("任务1: " + Thread.currentThread().getName()); }); // 提交Callable任务 Future<String> future = executor.submit(() -> "任务2结果"); executor.shutdown(); // 优雅关闭 } }
特点:
- 资源可控,减少线程创建开销
- 支持批量任务调度(
invokeAll()
) - 推荐生产环境使用
选择建议
场景 | 推荐方式 |
---|---|
简单任务 | Runnable + Thread |
需要返回值/异常处理 | Callable + 线程池 |
高并发、资源管理严格 | 线程池(Executor ) |
关键注意事项
-
线程安全:
- 共享资源需用
synchronized
或Lock
同步。 - 推荐使用
ConcurrentHashMap
等并发集合。
- 共享资源需用
-
避免直接调用run():
thread.run()
会在当前线程执行,而非新建线程。
-
线程中断:
- 使用
interrupt()
通知线程终止,而非stop()
(已废弃)。
- 使用
-
资源释放:
- 线程池用后需
shutdown()
,否则进程无法退出。
- 线程池用后需
-
异常处理:
- 线程内未捕获异常会导致线程终止,可通过
UncaughtExceptionHandler
处理。
- 线程内未捕获异常会导致线程终止,可通过
Java提供灵活的线程创建机制,从基础的Thread
类到高效的线程池,开发者需根据任务特性选择方案。重点推荐Runnable
+线程池组合,兼顾性能与代码可维护性,实际开发中务必关注线程安全与资源管理,避免并发陷阱。
引用说明基于Oracle官方文档《Java Concurrency in Practice》及Java 17 API规范,遵循Java语言标准实现,代码示例经过JDK 17环境验证,确保可靠性。