Java线程创建详解:继承Thread类的方法与实践

咖啡半糖
咖啡半糖
发布时间:2026-10-14| 3人浏览过
原创

在Java中,继承Thread类是创建线程的两种核心方式之一。本文将深入解析Thread类的构造重载、线程命名规则、start()方法的正确用法,以及如何避免常见的运行时异常,助你扎实掌握Java多线程基础。

Thread类的构造方法与参数解析

在Java中建立线程,必须实例化Thread类或其子类。即使使用Runnable接口,最终也需将其作为目标传入Thread构造函数。因此,理解Thread的构造方法是关键。以下是Thread类主要的八种构造形式及其参数说明:

  • public Thread( ):创建默认名称和属性的线程。
  • public Thread(Runnable target):将实现Runnable接口的对象作为任务目标。
  • public Thread(String name):指定线程名称。
  • public Thread(Runnable target, String name):同时指定任务和名称。
  • public Thread(ThreadGroup group, Runnable target):指定线程组和目标。
  • public Thread(ThreadGroup group, String name):指定线程组和名称。
  • public Thread(ThreadGroup group, Runnable target, String name):同时指定组、目标和名称。
  • public Thread(ThreadGroup group, Runnable target, String name, long stackSize):额外指定栈大小。

各参数的含义如下:

  1. target (Runnable):实现了Runnable接口的实例。注意,Thread类本身也实现了Runnable接口,因此Thread的子类实例也可作为target传入。
  2. name (String):线程的名称。若未显式设置,系统自动分配默认名Thread-N(N为不重复的正整数)。后续可通过setName()修改。
  3. group (ThreadGroup):线程所属的线程组。若不指定,线程加入默认线程组。
  4. stackSize (long):线程栈的大小。通常为CPU页面大小的整数倍(如x86平台下默认12KB)。

实战:继承Thread类并覆盖run方法

一个普通的Java类只需继承Thread并重写run()方法,即可成为线程类。真正的线程代码逻辑需在run()中定义,并通过调用start()方法来触发执行,而非直接调用run()。

第一步:定义线程类并实现逻辑

新建一个继承自Thread的类Thread1,在run()方法中输出当前线程名称:

package mythread;

public class Thread1 extends Thread {
    @Override
    public void run() {
        System.out.println(this.getName());
    }

    public static void main(String[] args) {
        // 获取主线程名称
        System.out.println(Thread.currentThread().getName());
        
        // 实例化两个子线程
        Thread1 thread1 = new Thread1();
        Thread1 thread2 = new Thread1();
        
        // 启动线程
        thread1.start();
        thread2.start();
    }
}

第二步:分析执行结果

运行上述代码,输出结果通常如下:

main
Thread-0
Thread-1

结果解析:

  • main:这是Java程序的主线程,所有Java应用至少包含一个主线程。
  • Thread-0和Thread-1:系统自动分配的默认线程名,按创建顺序递增。
注意:只有当程序中建立了除主线程以外的其他线程时,才构成真正的多线程程序。

自定义线程名称的设置技巧

虽然默认名称可用,但为了便于调试和维护,建议自定义线程名。有两种主要方式:通过构造函数传递或通过setName()方法动态设置。

示例:混合使用构造函数与setName

创建一个Thread2类,包含标识符who和多种构造方式:

package mythread;

public class Thread2 extends Thread {
    private String who;

    // 仅设置标识符,使用默认线程名
    public Thread2(String who) {
        super(); // 调用父类无参构造
        this.who = who;
    }

    // 同时设置标识符和线程名
    public Thread2(String who, String name) {
        super(name); // 调用父类带参构造设置线程名
        this.who = who;
    }

    @Override
    public void run() {
        System.out.println(who + ":" + this.getName());
    }

    public static void main(String[] args) {
        // thread1: 通过构造函数设置名为 "MyThread1"
        Thread2 thread1 = new Thread2("thread1", "MyThread1");
        
        // thread2: 初始默认名,稍后通过setName修改
        Thread2 thread2 = new Thread2("thread2");
        
        // thread3: 完全使用默认设置
        Thread2 thread3 = new Thread3("thread3");
        
        // 动态修改thread2的名称
        thread2.setName("MyThread2");
        
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

运行结果示例:

thread1:MyThread1
thread2:MyThread2
thread3:Thread-2

结果分析关键点

  1. thread1:成功通过super(name)设置了名称。
  2. thread2:先获得默认名(因thread1占用Thread-0,它可能获得Thread-1),随后被setName改为MyThread2。
  3. thread3:未被命名,故获得下一个可用默认名Thread-2。
风险提示:setName()可在start()前后调用。但在start()之后调用存在不确定性,因为setName的执行可能与run()中的读取操作并发,导致看到的仍是旧名称。建议在start()前完成所有名称设置。

常见陷阱:IllegalThreadStateException

Thread的start()方法只能调用一次。如果试图对同一线程实例再次调用start(),JVM会抛出java.lang.IllegalThreadStateException异常。

原因:线程状态一旦进入“RUNNABLE”或更终态,便无法重置回“NEW”状态重新启动。

简要总结

通过继承Thread类创建线程,核心在于重写run()并调用start()。合理设置线程名有助于排查问题,而避免重复调用start()则是保证程序稳定运行的基本规范。以上就是Java使用Thread类创建线程的详细教程,更多关于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 算法库。