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)来管理线程,但理解这三种基础方式对掌握并发编程非常重要。