Java 多线程入门:别再只会 new Thread 了
【摘要】 Java 多线程入门:别再只会 new Thread 了多线程是 Java 里绕不开的话题。很多新手写并发代码时,第一反应就是 new Thread(() -> doSomething()).start(),看起来简单直接,但实际开发中这么写隐患不少。今天就来聊聊 Java 多线程的正确打开方式。 为什么不建议直接 new Thread?资源不可控:每次 new 都创建一个新线程,线程创建...
Java 多线程入门:别再只会 new Thread 了
多线程是 Java 里绕不开的话题。很多新手写并发代码时,第一反应就是 new Thread(() -> doSomething()).start(),看起来简单直接,但实际开发中这么写隐患不少。今天就来聊聊 Java 多线程的正确打开方式。
为什么不建议直接 new Thread?
- 资源不可控:每次 new 都创建一个新线程,线程创建和销毁的开销不小。如果请求量大,可能瞬间创建成百上千个线程,直接把系统拖垮。
- 缺乏统一管理:没有线程池的调度,无法复用线程,也无法控制最大并发数。
- 异常难以处理:线程里抛出的异常如果不 catch,只会打印到控制台,调用方根本感知不到。
创建线程的几种方式
1. 继承 Thread 类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("子线程执行");
}
}
new MyThread().start();
缺点:Java 是单继承,继承了 Thread 就不能再继承其他类了。
2. 实现 Runnable 接口(推荐)
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("子线程执行");
}
}
new Thread(new MyTask()).start();
好处:解耦了"任务"和"线程",而且可以实现其他接口,更灵活。
3. 实现 Callable 接口(有返回值)
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "执行结果";
}
}
FutureTask<String> task = new FutureTask<>(new MyCallable());
new Thread(task).start();
String result = task.get(); // 阻塞获取结果
当你需要拿到线程的执行结果时,就用 Callable + FutureTask。
线程池:生产环境的标配
Java 提供了 ThreadPoolExecutor 来创建线程池,核心参数有 7 个:
new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // 工作队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
简单理解工作流程:
- 任务来了,先交给核心线程执行;
- 核心线程满了,任务进队列排队;
- 队列也满了,创建非核心线程来帮忙;
- 线程数达到最大值且队列也满了,触发拒绝策略。
注意:阿里巴巴 Java 开发手册明确禁止使用 Executors.newFixedThreadPool() 等快捷方法,因为它们的队列是无界的,可能导致 OOM。老老实实用 ThreadPoolExecutor 手动创建。
线程安全三要素
- 原子性:操作不可分割,比如
AtomicInteger的自增。 - 可见性:一个线程修改了变量,其他线程能立刻看到,
volatile关键字保证可见性。 - 有序性:指令重排序不会影响到正确性,
volatile也能禁止指令重排。
一句话总结
- 别直接
new Thread,用线程池管理。 - 创建任务优先用
Runnable,需要返回值用Callable。 - 线程池参数要根据业务场景调优,别用
Executors的快捷方法。 - 共享变量要注意线程安全,善用
volatile、synchronized、Lock和并发包工具。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)