Java如何使用Thread类创建多线程_Java多线程入门与线程启动方式详解

通过继承Thread类并重写run()方法可创建线程,调用start()方法启动,使线程并发执行,其中Thread.currentThread()用于获取当前线程信息,自定义线程名称有助于调试,适合初学者掌握多线程基础。

在Java中,实现多线程是提升程序并发性能的重要手段。其中,通过继承Thread类是最基础、最直观的创建线程的方式之一。本文将详细介绍如何使用Thread类创建多线程,并讲解线程的启动方式与基本用法,适合初学者快速入门。

继承Thread类创建线程

Java中的Thread类位于java.lang包中,代表一个线程执行单元。要通过继承Thread类创建线程,只需定义一个类继承Thread,并重写其run()方法,该方法中包含线程要执行的任务逻辑。

示例代码如下:

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
            try {
                Thread.sleep(100); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
          

} } } }

在主方法中创建并启动线程:

public class ThreadExample {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.start(); // 启动第一个线程
        t2.start(); // 启动第二个线程
    }
}

注意:不能直接调用run()方法。如果调用t1.run(),任务会在主线程中同步执行,不会开启新线程。

Thread.currentThread()的作用

Thread.currentThread()是一个静态方法,用于获取当前正在执行的线程对象。常用于:

  • 获取线程名称:currentThread().getName()
  • 获取线程ID:currentThread().getId()
  • 中断当前线程:currentThread().interrupt()

在上面的例子中,输出会显示每个线程的名字(如Thread-0、Thread-1)和执行的循环值,帮助区分不同线程的运行状态。

线程的启动方式:start() vs run()

理解start()run()的区别是掌握多线程的关键。

  • start():由JVM调用,真正启动一个新线程,系统会为该线程分配资源并自动调用其run()方法。这是正确的启动方式。
  • run():只是一个普通方法调用。如果直接调用,代码会在当前线程中执行,不会产生新的线程。

错误示例:

t1.run(); // 错误!在主线程中执行,未开启新线程

正确做法始终是调用start()方法。

自定义线程名称

默认情况下,线程名称为Thread-0、Thread-1等,不利于调试。可以通过构造函数设置有意义的名称:

class NamedThread extends Thread {
    public NamedThread(String name) {
        super(name); // 设置线程名
    }

    public void run() {
        System.out.println("线程 " + getName() + " 正在运行");
    }
}

// 使用
NamedThread nt = new NamedThread("Worker-1");
nt.start();

输出结果会显示“线程 Worker-1 正在运行”,便于日志追踪和问题排查。

基本上就这些。使用Thread类创建线程简单直接,适合学习多线程的基本概念和执行流程。虽然实际开发中更多采用实现Runnable接口的方式(避免单继承限制),但理解Thread类的使用仍是Java多线程的入门必经之路。