1. 线程创建方式概述
在Java并发编程中,线程是最基础的执行单元。理解线程创建的不同方式及其适用场景,是掌握并发编程的第一步。根据Java标准库的设计,创建线程主要有三种标准方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
这三种方式看似简单,但在实际应用中却各有特点和适用场景。作为从业多年的Java开发者,我见过太多因为线程创建方式选择不当导致的性能问题和资源浪费。比如在Web服务器中错误地直接继承Thread类导致线程数失控,或者在高并发任务处理时没有合理使用Callable而丢失了任务执行结果。
重要提示:无论采用哪种方式创建线程,最终都需要通过Thread类来实际启动线程。理解这一点对后续掌握线程池原理至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 继承Thread类方式
2.1 基本实现方式
继承Thread类是最直观的线程创建方式。开发者只需创建一个继承自Thread的子类,并重写run()方法即可:
java复制class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行中: " + Thread.currentThread().getName());
}
}
// 使用方式
MyThread thread = new MyThread();
thread.start();
这种方式的优点是简单直接,适合快速验证和简单场景。我在早期项目中也经常使用这种方式进行原型开发。
2.2 潜在问题与局限性
但在实际生产环境中,这种方式存在几个严重问题:
-
单继承限制:Java不支持多继承,一旦继承了Thread类就无法继承其他类,这在面向对象设计中是个硬伤。
-
线程复用困难:每次执行任务都需要创建新线程对象,无法复用已有线程,这在需要频繁创建线程的场景下会导致严重的性能问题。
-
职责不单一:线程执行逻辑与线程本身耦合在一起,违反了单一职责原则。
我曾经在一个日志收集系统中看到开发者大量使用继承Thread的方式,结果当系统负载升高时,线程创建和销毁的开销竟然占用了30%的CPU资源。
