如何创建Java多线程
在 Java 中,创建多线程主要有 4 种常见方式。下面从最常用到不常用逐步说明,并附示例代码。
一、继承 Thread 类(不推荐)
示例
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行:" + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start(); // 启动线程
}
}
缺点
- Java 是单继承,继承 Thread 后不能再继承其他类
- 不利于资源共享
二、实现 Runnable 接口(✅ 推荐)
示例
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程执行:" + Thread.currentThread().getName());
}
}
public class Test {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
}
}
优点
- 解耦任务和线程
- 适合资源共享
- 更灵活
三、实现 Callable + Future(有返回值)
示例
import java.util.concurrent.*;
class MyCallable implements Callable {
@Override
public String call() throws Exception {
return "线程执行完成:" + Thread.currentThread().getName();
}
}
public class Test {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newSingleThreadExecutor();
Future future = pool.submit(new MyCallable());
System.out.println(future.get()); // 获取返回值
pool.shutdown();
}
}
特点
- 可以返回结果
- 可以抛出异常
- 适合复杂任务
四、使用线程池(✅ 企业级推荐)
示例
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
pool.execute(() -> {
System.out.println("线程:" + Thread.currentThread().getName());
});
}
pool.shutdown();
}
}
优点
- 控制线程数量
- 提高性能
- 避免频繁创建销毁线程
五、Lambda 简化写法(Java 8+)
new Thread(() -> {
System.out.println("Lambda 线程");
}).start();
六、启动线程的正确方式
✅ 正确:
thread.start(); // 启动新线程
❌ 错误:
thread.run(); // 只是普通方法调用
七、总结对比
| 方式 | 是否有返回值 | 推荐程度 |
|---|---|---|
| Thread | 否 | ⭐ |
| Runnable | 否 | ⭐⭐⭐ |
| Callable | ✅ | ⭐⭐⭐ |
| 线程池 | ✅ | ⭐⭐⭐⭐⭐ |
八、常见面试问题
start()和run()的区别?- Runnable 和 Callable 的区别?
- 为什么推荐线程池?
- 线程安全如何保证?
如果你愿意,我可以 结合面试角度 或 模拟一个真实业务场景 再详细讲。