java多线程入门核心是选择thread类或runnable接口:继承thread适合快速验证但受单继承限制且无法共享状态;实现runnable是项目首选,支持多继承、资源共享和“组合优于继承”,启动必须调用start()而非run()。

Java 多线程入门,关键不在“多”,而在“怎么让多个任务真正并发执行”。核心就两条路:用 Thread 类 或 Runnable 接口。选对方式,代码清晰、扩展性强;选错,后期改起来头疼。
继承 Thread 类:适合快速验证逻辑
直接写个类继承 Thread,重写 run() 方法,把要并发做的事放进去。调用 start() 就能跑新线程——注意不是 run(),那是普通方法调用,不新开线程。
- 优点是结构直白,新手一眼看懂“这个类就是个线程”
- 缺点是 Java 只允许单继承,一旦你这个类已经继承了别的类(比如
Frame或某个业务基类),这条路就走不通 - 每个线程实例都独占一份任务逻辑,无法共享状态(比如多个线程共用同一个计数器)
实现 Runnable 接口:项目开发首选
定义一个类实现 Runnable,只专注写任务逻辑(run() 方法),然后把这个对象塞进 Thread 构造器里,再 start()。本质上是“把任务交给线程去执行”,职责更分明。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不受继承限制,你的任务类还能同时继承其他类、实现其他接口
- 多个
Thread实例可以共用同一个Runnable对象,天然支持资源共享(例如多个线程累加同一个变量) - 符合“组合优于继承”的设计原则,更易测试、复用和维护
别踩的坑:start() 和 run() 别搞混
无论哪种方式,启动线程必须调用 start()。它会触发 JVM 创建底层操作系统线程,并最终回调 run()。如果直接调用 run(),只是在当前线程里顺序执行代码,完全没并发效果。
- 常见错误:调试时为了方便,手贱写了
task.run(),结果程序跑得慢还看不出问题 - 验证是否真开了新线程?打印
Thread.currentThread().getName(),主线程叫main,子线程默认叫Thread-0、Thread-1等
实际写法建议:从 Runnable 开始练
哪怕只是写个 Demo,也优先用 Runnable。比如:
public class PrintTask implements Runnable {
@Override
public void run() {
System.out.println("Hello from " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
PrintTask task = new PrintTask();
new Thread(task, "Worker-1").start();
new Thread(task, "Worker-2").start();
}
}
- 名字可读性强,任务和线程解耦
- 后续想换线程池?只需把
new Thread(...).start()换成executor.submit(task),任务类完全不用动 - 面试官看到这种写法,基本默认你理解了多线程的设计意图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










