Java多线程初阶(二):核心方法与生命周期

一、Thread类的核心方法

1.1构造方法

|-------------------------------------|-----------|
| 构造器 | 说明 |
| Thread() | 默认名称 |
| Thread(String name) | 指定线程名称 |
| Thread(Runnable target) | 传入任务 |
| Thread(Runnable target,String name) | 同时指定任务和名称 |

3.2常用实例方法

1.start()------启动线程

2.join()------等待线程结束

java 复制代码
Thread t = new Thread(() -> {
    Thread.sleep(2000);
    System.out.println("子线程结束");
});
t.start();
t.join();  // 主线程阻塞,直到t执行完毕
System.out.println("主线程继续");

join():无限等待。

join(long millis):最多等待指定毫秒,超时则不再等待。

3.sleep()------休眠当前线程

java 复制代码
Thread.sleep(1000);  // 当前线程暂停1秒

静态方法:让当前正在执行的线程休眠

不会释放锁(持有锁时sleep,其他线程依然无法进入同步块)。

可能抛出InterruptExection。

4.interrupt()------中断线程

java 复制代码
Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // 正常工作
    }
    System.out.println("线程被中断,退出");
});
t.start();
Thread.sleep(1000);
t.interrupt();  // 设置中断标志

两种响应方式:

1.线程处于sleep/wait/join阻塞时,抛出InterruptedException,并清除中断标志。

2.线程正在运行,仅设置中断标志,需要线程自己检查isInterrupted()并退出。

注意:interrupted()是静态方法,判断当前线程是否是中断,且清除标志位;

isInterrupted()是实例方法,只判断不清除。

5.currentThread()------获取当前线程引用

java 复制代码
Thread current = Thread.currentThread();
System.out.println(current.getName());

其他常用方法

|-------------------|---------------------------------|
| 方法 | 说明 |
| getId() | 线程唯一ID |
| getState() | 获取线程状态 |
| isAlive() | 线程是否还或者 |
| setDaemon(true) | 设置为守护线程(GC线程),JVM 在所有非守护线程结束时退出 |
| setPriority(int ) | 设置优先级,只是建议,不保证 |

二、线程的生命周期(6种状态)

线程从创建到销毁,会经历不同状态。理解状态转移是调试多线程问题的基础。

4.1Thread.State枚举

|------|---------------|----------------------------|-------------------------------------|
| 状态 | 名称 | 含义 | 进入方式 |
| 新建 | NEW | 线程对象已创建,但未调用start() | new Thread |
| 可运行 | RUNNABLE | 在JVM种运行,可能在执行 也可能在等待CPU时间片 | start()之后 |
| 阻塞 | BLOCKED | 等待获取监视器锁 | 进入同步块/ 方法时锁被占用 |
| 无线等待 | WAITING | 等待其他线程显示唤醒 | wait()、join()无超时 LockSupport.park() |
| 限时等待 | TIMED_WAITING | 等待一段时间后自动唤醒 | sleep()、wait(time) join(time) |
| 终止 | TERMINATED | 线程执行完毕 | run()正常退出或异常退出 |

4.2状态转移图

NEW

│ start()

RUNNABLE ──────────────────────→ TERMINATED

│ (run()结束)

│ 进入synchronized块时锁被占用

BLOCKED ←── 获得锁 ──→ RUNNABLE

RUNNABLE

│ wait() / join() (无超时)

WAITING ←── notify/notifyAll/线程结束 ──→ RUNNABLE

RUNNABLE

│ sleep() / wait(timeout) / join(timeout)

TIMED_WAITING ←── 超时或被唤醒 ──→ RUNNABLE

4.3代码验证状态

java 复制代码
public class StateDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(2000);  // TIMED_WAITING
            } catch (InterruptedException e) {}
        });
        System.out.println(t.getState());  // NEW
        t.start();
        System.out.println(t.getState());  // RUNNABLE
        Thread.sleep(1000);
        System.out.println(t.getState());  // TIMED_WAITING
        t.join();
        System.out.println(t.getState());  // TERMINATED
    }
}

4.4关于isAlive()

1.isAlive()返回true当线程状态未RUNABLE、BLOCKED、WAITING、TIMED_WAITING。

2.NEW和TERMINATED状态返回false。