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
原理:实现 Callable
的 call()
方法(可返回结果和抛出异常),配合 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);}
}
关键注意事项
-
启动线程必须调用
start()
而非run()
start()
:JVM 创建新线程并异步执行run()
。run()
:仅在当前线程同步执行方法(不会启动新线程)。
-
线程生命周期
新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked)→ 终止(Terminated)。 -
推荐使用
Runnable
或Callable
更灵活,符合面向接口编程原则,适合线程池管理。 -
线程池(高级用法)
实际开发中建议使用线程池(如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 使用 |
根据需求选择合适的方式,优先推荐 Runnable
或 Callable
!