目录
在Java中,创建线程主要有以下四种方式:
1. 继承 Thread 类
通过继承 Thread 类并重写 run() 方法创建线程。
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行中(继承Thread)");
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程
}
}
2. 实现 Runnable 接口
实现 Runnable 接口的 run() 方法,并将实例传递给 Thread 对象。
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行中(实现Runnable)");
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
3. 实现 Callable 接口(支持返回值)
实现 Callable 接口的 call() 方法,通过 FutureTask 获取返回值。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "线程返回值(实现Callable)";
}
}
// 使用示例
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();
System.out.println(futureTask.get()); // 获取返回值
}
}
4. 使用线程池(推荐)
通过 ExecutorService 线程池管理线程,高效复用资源。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务(支持Runnable或Callable)
executor.execute(() -> {
System.out.println("线程运行中(线程池)");
});
// 关闭线程池
executor.shutdown();
}
}
对比总结
| 方式 | 优点 | 缺点 | 适用场景 |
| 继承 | 简单直接 | 无法继承其他类 | 简单任务 |
| 实现 | 可继承其他类,任务与线程分离 | 无返回值 | 大多数异步任务 |
| 实现 | 支持返回值和异常 | 需结合 | 需要结果的任务 |
| 线程池 | 资源复用、管理高效(推荐) | 需手动配置参数 | 生产环境高并发场景 |
关键注意点
- 启动线程:必须调用
start()方法(而非直接调用run()),否则会在主线程同步执行。 - 线程安全:多线程共享资源时需使用同步机制(如
synchronized、Lock)。 - 线程池优势:
-
- 降低资源消耗(复用线程)
- 提高响应速度(无需新建线程)
- 提供任务管理功能(队列、拒绝策略等)
推荐实践:
生产环境中优先使用 线程池 + Runnable/Callable,避免频繁创建销毁线程,提升系统性能。
1587

被折叠的 条评论
为什么被折叠?



