Java中Semaphore类与Runnable接口的组合使用及装饰者模式应用

胖婷酱_2810

胖婷酱_2810

2026-06-04

634人浏览

原创

java中semaphore用于限制runnable并发数,装饰者模式用于动态增强任务行为;二者职责分离但可协同:semaphore管“能否执行”,装饰器管“如何更好执行”,如timedsemaphorerunnable既限流又计时。

java中semaphore类与runnable接口的组合使用及装饰者模式应用

Java中把Semaphore和Runnable组合起来,主要是为任务加一层“并发闸门”——控制同时能跑几个;而装饰者模式不是用来管数量的,是给任务动态加行为的,比如记录耗时、重试逻辑或统一日志。两者可以一起用,但目标不同、职责分离。

用Semaphore限制Runnable任务的实际并发数

核心思路是:每个Runnable在执行前先acquire()一个许可,执行完再release()。没拿到许可的任务会自动阻塞,等前面的任务释放后才能继续。

  • 创建Semaphore时指定许可数,例如new Semaphore(3)表示最多3个任务并行
  • Runnable实现类里持有该Semaphore引用,run()中必须包裹acquire()/release(),且推荐用try-finally确保释放不遗漏
  • 如果不想让线程无限等待,可用tryAcquire(long timeout, TimeUnit unit)设置超时,获取失败就跳过或降级处理

用装饰者模式增强Runnable的行为

直接实现Runnable写死逻辑难复用,装饰者模式让你把通用增强功能(如统计执行时间、捕获异常、添加上下文)抽离成独立组件,再“套”在任意Runnable外面。

  • 定义一个装饰器接口,比如interface RunnableDecorator extends Runnable,或更通用的泛型接口Decorator<t></t>
  • 写具体装饰器类,构造时接收原始Runnable,内部持有一个引用;run()方法里先做增强动作(如记录开始时间),再调用原始run(),最后收尾(如打印耗时)
  • 可叠加使用:A装饰B,C再装饰A,形成链式增强,无需修改原始任务代码

二者协同:带限流+增强能力的任务封装

把Semaphore控制和装饰逻辑合到一个Runnable实现里,既限并发,又自带可观测性或健壮性。这不是强行拼凑,而是分层控制:Semaphore管“能不能跑”,装饰逻辑管“怎么跑得更稳更好”。

  • 例如写一个TimedSemaphoreRunnable类,它既是Runnable,又接收Semaphore和被包装的Runnable作为参数
  • run()中先acquire(),再用System.nanoTime()打点计时,调用原始任务,finally里release()并打印耗时
  • 这样每次提交任务时,你拿到的是一个“自带限流+计时”的完整单元,线程池只管调度,不用关心底层细节

注意几个关键细节

实际编码中容易忽略但影响稳定性的点:

  • Semaphore的acquire()可能抛出InterruptedException,务必捕获并正确处理(如恢复中断状态Thread.currentThread().interrupt())
  • release()必须放在finally块里,否则任务中途异常退出会导致许可泄露,后续所有任务永久阻塞
  • 装饰器不要在构造阶段执行业务逻辑,所有增强动作应严格放在run()内,保证延迟生效、线程安全
  • 如果Runnable需要返回值,原始接口不支持,得改用Callable+Future,或者用装饰器内部设result字段+join()同步获取

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10457

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7582

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6632

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1144

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1376

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2749

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20071

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1215

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习