java park方法怎么用?

发布时间 - 2025-12-26 00:00:00    点击率:
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 线程

输出结果:

线程开始执行
主线程发送 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 方法简单但强大,适合底层并发控制。


# java  # 工具  # ai 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何优化应用性能?(缓存和优化命令)  如何用免费手机建站系统零基础打造专业网站?  Laravel如何实现API速率限制?(Rate Limiting教程)  青岛网站建设如何选择本地服务器?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  javascript读取文本节点方法小结  如何用AI帮你把自己的生活经历写成一个有趣的故事?  高性价比服务器租赁——企业级配置与24小时运维服务  如何快速查询网址的建站时间与历史轨迹?  香港服务器部署网站为何提示未备案?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  电商网站制作价格怎么算,网上拍卖流程以及规则?  网站优化排名时,需要考虑哪些问题呢?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何在服务器上三步完成建站并提升流量?  微信小程序 require机制详解及实例代码  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  如何在阿里云服务器自主搭建网站?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  jQuery中的100个技巧汇总  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  大型企业网站制作流程,做网站需要注册公司吗?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  canvas 画布在主流浏览器中的尺寸限制详细介绍  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  实例解析Array和String方法  如何在阿里云购买域名并搭建网站?  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  高防服务器租用指南:配置选择与快速部署攻略  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  音响网站制作视频教程,隆霸音响官方网站?  javascript基于原型链的继承及call和apply函数用法分析  郑州企业网站制作公司,郑州招聘网站有哪些?  香港服务器租用费用高吗?如何避免常见误区?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何快速查询域名建站关键信息?  Laravel storage目录权限问题_Laravel文件写入权限设置  海南网站制作公司有哪些,海口网是哪家的?  如何解决hover在ie6中的兼容性问题  个人网站制作流程图片大全,个人网站如何注销?