java park方法怎么用?

Java中的park方法是LockSupport类提供的线程阻塞工具,用于暂停当前线程直至被唤醒。1. park()阻塞线程,直到其他线程调用unpark()、线程被中断或虚假唤醒;unpark()提前调用也有效,因每个线程有最多一个许可。2. 与wait/notify不同,park/unpark无需锁、不抛异常,可先发unpark再park。3. 可结合Thread.interrupted()检测中断。4. 常用于实现AQS、ReentrantLock等同步器及线程协作。该机制简洁高效,适用于底层并发控制。

Java 中的 park 方法是 java.util.concurrent.locks.LockSupport 类提供的一个底层线程阻塞工具,用于暂停当前线程,直到被其他线程唤醒。它常用于构建高级同步器(如 AQS)中,不依赖 synchronized 或 Object.wait/notify 机制。

1. 基本用法:park() 和 unpark()

park() 会阻塞当前线程,直到发生以下情况之一:
  • 另一个线程调用当前线程的 unpark(Thread t)
  • 当前线程被中断
  • 虚假唤醒(极少见)

示例代码:

Thread worker = new Thread(() -> { System.out.println("线程开始执行"); LockSupport.park(); // 阻塞在这里 System.out.println("线程被唤醒"); }); worker.start(); try { Thread.sleep(1000); } catch (Interrupt

edException e) {} System.out.println("主线程发送 unpark"); LockSupport.unpark(worker); // 唤醒 worker 线程

输出结果:

线程开始执行
主线程发送 unpark
线程被唤醒

2. park() 的特点

与 wait/notify 不同,park/unpark 更灵活:
  • unpark 可以在 park 之前调用 —— 如果先调用 unpark,再调用 park,线程不会阻塞(因为“许可”已存在)
  • 每个线程都有一个与之关联的“许可”(permit),最多为1(不会累加)
  • 不需要获取锁就可以调用
  • 不会抛出 InterruptedException,但可通过 Thread.interrupted() 检测中断状态

3. 带中断检测的 park

如果你希望在中断时做出响应,可以结合中断标志判断: Thread t = new Thread(() -> { System.out.println("运行中..."); LockSupport.park(); if (Thread.currentThread().isInterrupted()) { System.out.println("被中断了"); } else { System.out.println("被 unpark 唤醒"); } }); t.start(); try { Thread.sleep(1000); } catch (InterruptedException e) {} t.interrupt(); // 中断线程

4. 常见使用场景

park/unpark 主要用于:
  • 实现自定义锁或同步器(如 ReentrantLock 内部使用)
  • 线程协作控制,比如工作线程等待任务
  • 避免使用 wait/notify 的复杂锁逻辑

基本上就这些。park 方法简单但强大,适合底层并发控制。