Java多线程创建方式详解:继承Thread与实现Runnable对比

沈知远
沈知远
发布时间:2026-10-14| 2人浏览过
原创

在Java并发编程中,创建和管理线程是核心技能之一。本文将深入解析Java多线程创建的两种主要途径:通过继承 Thread 类或实现 Runnable 接口,分析其操作细节、代码结构及最佳实践。

Java线程的基础概念

Java中的线程由 java.lang.Thread 类及其子类表示。要执行一个独立的线程任务,首先需要实例化线程对象,并通过调用 start() 方法来触发其执行逻辑。若未提供具体的运行代码,线程启动后会立即终止。

方法一:继承 Thread 类

这是最直观的线程创建方式。通过创建一个继承自 Thread 的类,并重写其 run() 方法,即可定义线程的执行体。

第1步:定义Thread子类

创建一个新类继承 Thread,并在 run() 方法中编写业务逻辑。

public class MyThread extends Thread {
    public void run(){
        System.out.println("MyThread running");
    }
}

第2步:启动线程

实例化该子类并调用 start() 方法。注意:start() 会立即返回,不会阻塞当前线程,新的线程将在后台执行 run() 方法。

MyThread myThread = new MyThread();
myThread.start(); // 修正原稿中的拼写错误 myTread -> myThread

第3步:使用匿名内部类简化

若无需复用线程类,可直接创建 Thread 的匿名子类:

Thread thread = new Thread(){
    public void run(){
        System.out.println("Thread Running");
    }
};
thread.start();

方法二:实现 Runnable 接口

这种方式将线程的任务逻辑(run())与线程的控制机制(Thread)分离,是更推荐的实践方式。

第1步:实现Runnable接口

创建一个实现 java.lang.Runnable 接口的类,并实现 run() 方法。

public class MyRunnable implements Runnable {
    public void run(){
        System.out.println("MyRunnable running");
    }
}

第2步:将Runnable实例传给Thread

Thread 类的构造函数接受 Runnable 对象作为参数。这种方式使得同一个 Runnable 实例可以被多个线程共享,或者被线程池高效管理。

Thread thread = new Thread(new MyRunnable());
thread.start();

第3步:使用匿名Runnable

同样可以使用匿名内部类快速创建:

Runnable myRunnable = new Runnable(){
    public void run(){
        System.out.println("Runnable running");
    }
};
Thread thread = new Thread(myRunnable);
thread.start();

继承Thread还是实现Runnable?

虽然两种方式都能创建线程,但实现 Runnable 接口具有明显优势:

  • 资源分离:数据(Runnable)与执行器(Thread)解耦,便于代码复用。
  • 线程池支持:现代Java应用常使用线程池管理线程,线程池通常只接受 Runnable 或 Callable 任务,而非 Thread 实例。
  • 避免单继承限制:Java不支持多继承,若继承 Thread,则无法再继承其他类,而实现 Runnable 接口无此限制。

常见错误与注意事项

错误:直接调用 run() 而非 start()

初学者常犯的错误是直接调用 newThread.run()。这将导致 run() 方法在当前主线程中同步执行,而不是在新线程中异步执行,完全失去了多线程的意义。

Thread newThread = new Thread(new MyRunnable());
// newThread.run(); // 错误:在主线程执行
newThread.start(); // 正确:在新线程执行

获取线程名称

为线程命名有助于调试和日志追踪。可以通过 Thread 构造函数指定名称,或使用 Thread.currentThread().getName() 获取当前执行线程的名称。

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "Worker-Thread-1");
thread.start();
System.out.println(thread.getName()); // 输出: Worker-Thread-1

// 获取当前线程名
String currentName = Thread.currentThread().getName();

线程执行顺序的不确定性

即使按顺序启动线程,它们的实际执行顺序是不确定的,取决于操作系统调度器和JVM实现。例如:

public class ThreadExample {
    public static void main(String[] args){
        System.out.println("Main Thread: " + Thread.currentThread().getName());
        for(int i=0; i<5; i++){
            final int id = i;
            new Thread("" + id){
                public void run(){
                    System.out.println("Thread: " + getName() + " is running");
                }
            }.start();
        }
    }
}

上述代码中,线程0~4的输出顺序可能任意排列,这是并行执行的正常现象。

总结

在Java中创建多线程,优先推荐使用实现 Runnable 接口的方式,它更符合面向对象设计原则,且能更好地与现代并发工具类(如线程池)集成。务必确保通过 start() 方法启动线程,以避免陷入伪并行的陷阱。以上就是Java多线程创建方式的详细内容,更多关于Java并发编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。