一、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。