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 (InterruptedException e) {} System.out.println("主线程发送 unpark"); LockSupport.unpark(worker); // 唤醒 worker 线程输出结果:
此代码么有依靠js文件实现的,而且大图和小图是分开的,这样用户在打开网页的时候能节约不少时间和流量 此代码实现方法也很简单,可以直接把index.html和images下面的文件拷贝到你需要运行的位置,然后保存即可,images下面的大图和小图按照你的需求来改,也可以给大图增加链接。
主线程发送 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 方法简单但强大,适合底层并发控制。










