Java 创建线程的 3 种方式
1. 继承 Thread 类
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行中:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start(); // 启动线程
}
}
特点:
- 简单直接,但 Java 是单继承,继承了
Thread就不能再继承其他类。 - 通过
start()启动线程,run()方法定义线程任务。
2. 实现 Runnable 接口
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行中:" + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
t1.start();
}
}
特点:
- 避免了单继承的限制,可以实现多个接口。
- 任务与线程分离,更灵活,推荐使用。
3. 实现 Callable 接口(配合 FutureTask)
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "线程返回结果:" + Thread.currentThread().getName();
}
public static void main(String[] args) throws Exception {
MyCallable task = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(task);
Thread t1 = new Thread(futureTask);
t1.start();
// 获取线程执行后的返回结果
String result = futureTask.get();
System.out.println(result);
}
}
特点:
- 可以获取线程执行后的返回结果(通过
FutureTask)。 - 允许抛出异常,比
Runnable更强大。
总结对比
| 方式 | 是否有返回值 | 是否可抛出异常 | 推荐场景 |
|---|---|---|---|
| 继承 Thread | 否 | 否 | 简单临时任务 |
| 实现 Runnable | 否 | 否 | 任务与线程分离,常用 |
| 实现 Callable | 是 | 是 | 需要返回结果或处理异常 |
提示:实际开发中更常用线程池(如
ExecutorService)来管理线程,但理解这三种基础方式对掌握并发编程非常重要。
