Thread 类的基本用法、Java 线程的几种状态

张开发
2026/5/25 8:54:29 15 分钟阅读
Thread 类的基本用法、Java 线程的几种状态
线程创建 (Thread Creation)创建线程主要有两种逻辑继承Thread类或实现Runnable接口。方式1继承 Thread 类重写run()// 自定义线程类继承Thread class MyThread extends Thread { // 重写run()定义线程执行逻辑 Override public void run() { System.out.println(子线程执行 Thread.currentThread().getName()); } } // 使用 public class Demo { public static void main(String[] args) { MyThread t new MyThread(); t.start(); // 3. 调用start()启动线程不能直接调用run() } }方式2实现Runnable接口传给Thread// 实现Runnable接口 class MyRunnable implements Runnable { Override public void run() { System.out.println(子线程执行 Thread.currentThread().getName()); } } // 使用 public class Demo { public static void main(String[] args) { // 把Runnable实例传给Thread Thread t new Thread(new MyRunnable()); t.start(); // 启动线程 } }线程中断 (Thread Interruption)线程中断不是强制停止线程而是一种协作机制即给线程发一个“请停止”的信号。void interrupt()标记线程为 “中断状态”boolean isInterrupted()判断线程是否处于中断状态若线程在sleep/wait/join时被中断会抛出InterruptedException且中断状态会被清除Thread t new Thread(() - { while (!Thread.currentThread().isInterrupted()) { // 检测中断状态 System.out.println(线程运行中...); try { Thread.sleep(1000); } catch (InterruptedException e) { // 捕获中断异常后中断状态会被清除需手动终止循环 System.out.println(线程被中断); Thread.currentThread().interrupt(); // 重新标记中断可选 break; } } }); t.start(); // 主线程1秒后中断子线程 Thread.sleep(1000); t.interrupt();线程等待 (Thread Join)有时主线程需要等待子线程执行完毕后再继续执行这时可以使用join()。t.join()当前线程会进入阻塞状态直到线程t执行结束。带参数的 join(long millis)设置最大等待时间如果超时线程还没结束当前线程就不再等待。Thread t new Thread(() - { System.out.println(子线程开始执行); try { Thread.sleep(2000); } catch (InterruptedException e) {} System.out.println(子线程执行完毕); }); t.start(); // 主线程等待t执行完最多等3秒 t.join(3000); System.out.println(主线程继续执行);线程休眠 (Thread Sleep)static void sleep(long millis)让当前线程暂停指定时间不会释放锁抛出InterruptedExceptionSystem.out.println(开始休眠); try { Thread.sleep(2000); // 当前线程休眠2秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(休眠结束);获取线程实例 (Get Current Instance)在编写通用代码尤其是 Runnable 中时常需要知道是谁在运行。Thread.currentThread()返回代码当前正在执行的那个线程对象的引用。常用操作获取线程 ID (getId())、获取线程名称 (getName()) 等。// 获取当前线程这里是main线程 Thread mainThread Thread.currentThread(); System.out.println(当前线程名 mainThread.getName()); // 输出main // 子线程实例 Thread t new Thread(() - { Thread current Thread.currentThread(); System.out.println(子线程名 current.getName()); // 输出Thread-0 }); t.start();Java线程的几种状态线程状态一共有几种Java线程共有6种状态NEW (新建)RUNNABLE (可运行)BLOCKED (阻塞)WAITING (等待)TIMED_WAITING (超时等待)TERMINATED (终止)每种状态的含义与切换条件NEW (新建)含义创建了线程对象new Thread()但尚未调用 start() 方法。切换调用 start() 方法后进入 RUNNABLE 状态。RUNNABLE (可运行)含义Java 将操作系统中的“就绪Ready”和“运行中Running”两种状态统称为 RUNNABLE。处于该状态的线程可能正在 CPU 上执行也可能正在等待操作系统分配时间片。切换就绪 - 运行获得 CPU 时间片。运行 - 就绪CPU 时间片用完或主动调用 Thread.yield()。BLOCKED (阻塞)含义线程正在等待获取一个排他锁如进入synchronized 代码块/方法但该锁目前被其他线程持有。切换RUNNABLE - BLOCKED尝试进入 synchronized 区域失败。BLOCKED - RUNNABLE其他线程释放锁当前线程成功竞争到锁。WAITING (等待)含义线程处于无限期的等待状态不会被分配 CPU 时间必须等待其他线程显式地唤醒。切换RUNNABLE - WAITING调用 Object.wait()不带参数、Thread.join()不带参数或 LockSupport.park()。WAITING - RUNNABLE其他线程调用 Object.notify()、notifyAll() 或 LockSupport.unpark()。TIMED_WAITING (超时等待)含义与 WAITING 类似但在指定的时间后会自动唤醒不需要其他线程显式唤醒。切换RUNNABLE - TIMED_WAITING调用 Thread.sleep(ms)、Object.wait(ms)、Thread.join(ms) 等带时间参数的方法。TIMED_WAITING - RUNNABLE时间结束或被提前唤醒如 notify()。TERMINATED (终止)含义线程已经执行完毕run() 方法正常结束或因异常退出了执行。

更多文章