java thread start()和run()方法简析


在Java中,`Thread` 类的 `start()` 和 `run()` 方法是理解线程执行机制的基础。它们各自扮演着不同的角色,但共同协作以实现线程的并发执行。

### start() 方法

- **作用**:`start()` 方法用于启动线程,使线程处于就绪状态(ready state),等待被JVM(Java虚拟机)的调度器调度执行。

- **内部机制**:当调用线程的 `start()` 方法时,Java虚拟机为该线程分配所需的资源,并创建一个新的调用栈。然后,JVM会调用该线程的 `run()` 方法。

- **注意**:一个线程只能被启动一次。如果尝试再次调用已启动线程的 `start()` 方法,将会抛出 `IllegalThreadStateException` 异常。

### run() 方法

- **作用**:`run()` 方法是线程的主体部分,包含了线程需要执行的任务代码。但是,直接调用 `run()` 方法并不会启动新线程,而是像调用普通方法一样在当前线程中同步执行 `run()` 方法中的代码。

- **实现**:通常,我们通过继承 `Thread` 类并重写其 `run()` 方法来定义线程的执行体,或者使用实现 `Runnable` 接口的类作为线程的执行体(通过 `Thread` 类的构造函数传递给 `Thread` 实例)。

### 示例


// 通过继承Thread类
class MyThread extends Thread {
    public void run() {
        System.out.println("线程运行中...");
    }
}

// 使用Runnable接口
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("通过Runnable实现的线程运行中...");
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 正确启动线程

        // 直接调用run()方法,不会启动新线程
        // t1.run(); // 如果取消注释,这将同步执行run()方法

        Thread t2 = new Thread(new MyRunnable());
        t2.start(); // 正确启动线程
    }
}

### 总结

- `start()` 方法用于启动线程,使线程进入就绪状态,等待执行。

- `run()` 方法定义了线程的执行体,但直接调用 `run()` 并不启动新线程。

- 正确的做法是重写 `run()` 方法,并通过调用 `start()` 方法来启动线程。