在Java中,线程的创建和管理是并发编程的核心内容。以下是关于线程创建方式、线程池用法及其优点的详细说明:
一、线程创建方式
Java中创建线程主要有以下三种方法:
1. 继承 Thread 类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread is running");
}
}
// 使用
MyThread thread = new MyThread();
thread.start(); // 启动线程
缺点:Java是单继承,无法再继承其他类。
2. 实现 Runnable 接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable thread is running");
}
}
// 使用
Thread thread = new Thread(new MyRunnable());
thread.start();
优点:避免单继承限制,适合多线程共享资源场景。
3. 实现 Callable 接口(结合 FutureTask)
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Callable result";
}
}
// 使用
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
String result = futureTask.get(); // 阻塞获取结果
优点:可以返回结果或抛出异常,适合需要异步计算的场景。
二、线程池的用法
Java通过 Executor 框架提供线程池支持,常用工厂类 Executors 或自定义 ThreadPoolExecutor。
1. 通过 Executors 创建线程池
// 创建固定大小的线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(5);
// 创建缓存线程池(自动扩容/收缩)
ExecutorService cachedPool = Executors.newCachedThreadPool();
// 提交任务
fixedPool.execute(() -> System.out.println("Runnable task")); // 无返回值
Future<String> future = fixedPool.submit(() -> "Callable task"); // 有返回值
2. 自定义 ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // 任务队列
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
executor.execute(() -> { /* 任务逻辑 */ });
3. 关闭线程池
executor.shutdown(); // 等待已提交任务执行完毕
executor.shutdownNow(); // 立即终止所有任务
三、线程池的好处
-
资源复用
复用已创建的线程,避免频繁创建和销毁线程的开销。 -
控制并发量
通过限制线程数量,防止资源耗尽(如OOM),提高系统稳定性。 -
统一管理任务
支持任务队列、拒绝策略、线程监控等功能,提升可管理性。 -
提高响应速度
任务到达时,可直接使用空闲线程执行,无需等待线程创建。 -
支持异步结果
通过Future或CompletableFuture获取异步任务的结果。
四、注意事项
-
避免使用
Executors的默认方法
如newFixedThreadPool和newCachedThreadPool可能因无界队列或线程数过多导致OOM。推荐手动配置ThreadPoolExecutor。 -
合理设置参数
根据业务场景调整核心线程数、队列类型(有界/无界)、拒绝策略(如丢弃任务或记录日志)。 -
异常处理
使用submit提交任务时,异常会被封装到Future中,需通过future.get()捕获。
总结
- 线程创建方式:继承
Thread、实现Runnable/Callable。 - 线程池用法:通过
Executors工厂或自定义ThreadPoolExecutor。 - 核心优势:资源复用、可控性高、性能优化。
548

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



