java如何创建线程呢?
下文笔者讲述java代码中创建线程的方法及示例分享,如下所示
创建线程的方式
方式1:
继承`Thread`类
重新其中的run方法
方式2:
实现`Runnable`接口
并将其作为参数传给`Thread`构造器
方式3:
使用`Callable`和`FutureTask`
与 `Runnable` 不同
`Callable` 支持返回值和抛出异常
方式4:
使用线程池的方式
使用`ExecutorService`线程池管理线程资源
提高性能和可维护性
例
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行中:" + Thread.currentThread().getName());
}
}
//使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
注意:
Java是单继承语言
如果类已经继承了其他类
就不能再继承`Thread`
//方式2:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行中:" + Thread.currentThread().getName());
}
}
//使用
Thread thread = new Thread(new MyRunnable(), "MyRunnableThread");
thread.start();
//方式3:
使用`Callable`和`FutureTask`
与`Runnable`不同
`Callable`支持返回值和抛出异常
例:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("线程运行中:" + Thread.currentThread().getName());
return "任务完成";
}
}
//使用
Callable<String> callable = new MyCallable();
FutureTask<String> task = new FutureTask<>(callable);
Thread thread = new Thread(task);
thread.start();
try {
String result = task.get(); // 获取返回结果
System.out.println("线程返回值:" + result);
} catch (Exception e) {
e.printStackTrace();
}
优点:支持返回值和异常处理。
常用于需要获取线程执行结果的场景。
//方式4:使用线程池(推荐)
使用`ExecutorService`线程池管理线程资源
提高性能和可维护性
例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 创建一个固定大小的线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
// 提交任务
executor.submit(() -> {
System.out.println("线程运行中:" + Thread.currentThread().getName());
});
// 关闭线程池
executor.shutdown();
//笔者推荐大家使用这种做法
//由于线程池可以复用线程、控制并发数量,适用于高并发场景。
六种常见线程池类型(来自`Executors`工厂类)
| 线程池类型 | 描述 |
| `newFixedThreadPool(int nThreads)` | 固定大小线程池, 适合负载较重的服务器 |
| `newCachedThreadPool()` | 缓存线程池,自动回收空闲线程, 适合执行短期异步任务 |
| `newSingleThreadExecutor()` | 单线程线程池, 保证任务顺序执行 |
| `newScheduledThreadPool(int corePoolSize)` | 支持定时和周期性任务调度的线程池 |
| `newWorkStealingPool()`(JDK 8+) | 使用ForkJoinPool 实现的并行线程池 |
| `newVirtualThreadPerTaskExecutor()`(JDK 21+) | 每个任务使用虚拟线程(协程), 极高并发 |
各种创建新线程的方式对比
| 方式 | 是否有返回值 | 是否可复用线程 | 是否推荐使用 |
| 继承 `Thread` | ❌ | ❌ | ❌(仅学习用) |
| 实现 `Runnable` | ❌ | ❌ | ✅(基础用法) |
| 使用 `Callable` + `FutureTask` | ✅ | ❌ | ✅(需返回值时) |
| 使用线程池(Executor) | ✅/❌(视任务而定) | ✅ | ✅✅(推荐) |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


