Java 多线程入门:别再只会 new Thread 了

举报
Brian-Tony 发表于 2026/10/29 08:41:57 2026/10/29
【摘要】 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() // 拒绝策略
);

简单理解工作流程:

  1. 任务来了,先交给核心线程执行;
  2. 核心线程满了,任务进队列排队;
  3. 队列也满了,创建非核心线程来帮忙;
  4. 线程数达到最大值且队列也满了,触发拒绝策略。

注意:阿里巴巴 Java 开发手册明确禁止使用 Executors.newFixedThreadPool() 等快捷方法,因为它们的队列是无界的,可能导致 OOM。老老实实用 ThreadPoolExecutor 手动创建。

线程安全三要素

  • 原子性:操作不可分割,比如 AtomicInteger 的自增。
  • 可见性:一个线程修改了变量,其他线程能立刻看到,volatile 关键字保证可见性。
  • 有序性:指令重排序不会影响到正确性,volatile 也能禁止指令重排。

一句话总结

  • 别直接 new Thread,用线程池管理。
  • 创建任务优先用 Runnable,需要返回值用 Callable。
  • 线程池参数要根据业务场景调优,别用 Executors 的快捷方法。
  • 共享变量要注意线程安全,善用 volatile、synchronized、Lock 和并发包工具。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。