热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线程(八)Semaphore

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!概念

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!  

概念:

Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。从概念上讲,Semaphore是一个计数信号量,Semaphore包含一组许可证。

如果有需要的话,每个acquire()方法都会阻塞,直到获取一个可用的许可证。每个release()方法都会释放持有许可证的线程,并且归还Semaphore一个可用的许可证。

使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。

Semaphore 是 synchronized 的加强版,作用是控制同时访问资源的线程个数(控制线程的并发数量)
当Semaphore初始值为1时其实就相当于 synchronized。

常用方法:

1.Semaphore(permits)

   初始化许可证数量的构造函数。

2.Semaphore(permits,fair)

   初始化许可证数量和是否公平模式的构造函数。

3.availablePermits()

   获取当前可用的许可证数量。

4.acquire()

   当前线程尝试去获取1个许可证。直到发生以下任意一件事:

   1):当前线程获取了1个可用的许可证,则会停止等待,继续执行。
   2):当前线程被中断,则会抛出InterruptedException异常,并停止等待,继续执行。

5.acquire(permits)

   当前线程尝试去获取permits个许可证。直到发生以下任意一件事:

   1):当前线程获取了permits个可用的许可证,则会停止等待,继续执行。
   2):当前线程被中断,则会抛出InterruptedException异常,并停止等待,继续执行。

6.tryAcquire()

   当前线程尝试去获取1个许可证。

   1):如果当前线程获取了1个可用的许可证,则会停止等待,继续执行,并返回true。

   2):如果当前线程没有获得这个许可证,也会停止等待,继续执行,并返回false。

7.tryAcquire(permits)

   当前线程尝试去获取permits个许可证。

   1):如果当前线程获取了permits个可用的许可证,则会停止等待,继续执行,并返回true。

   2):如果当前线程没有获得permits个许可证,也会停止等待,继续执行,并返回false。

8.tryAcquire(timeout,TimeUnit)

   当前线程在限定时间内,尝试去获取1个许可证。直到发生以下任意一件事:

   1):当前线程获取了可用的许可证,则会停止等待,继续执行,并返回true。

   2):当前线程等待时间timeout超时,则会停止等待,继续执行,并返回false。

   3):当前线程在timeout时间内被中断,则会抛出InterruptedException一次,并停止等待,继续执行。

9.tryAcquire(permits,timeout,TimeUnit)

   当前线程在限定时间内,尝试去获取permits个许可证。直到发生以下任意一件事:

   1):当前线程获取了可用的permits个许可证,则会停止等待,继续执行,并返回true。

   2):当前线程等待时间timeout超时,则会停止等待,继续执行,并返回false。

   3):当前线程在timeout时间内被中断,则会抛出InterruptedException一次,并停止等待,继续执行。

10.release()

   当前线程释放1个可用的许可证。

11.release(permits)

   当前线程释放permits个可用的许可证。

因为平时用的不多,就简单举例记录一下,这个例子包含3个类,一个是线程类,一个是 线程要操作的资源类,一个类是主main方法类:

代码如下:

public class SemaphoreTest {public static void main(String[] args) {DoSomething doSomething &#61; new DoSomething();for (int i&#61;0;i<10;i&#43;&#43;){Task t &#61; new Task(doSomething);t.start();}}static class DoSomething{Semaphore semaphore &#61; new Semaphore(2);public void doSome(){try {semaphore.acquire();System.out.println(Thread.currentThread().getName() &#43; ":开始任务");Thread.sleep(2000);System.out.println(Thread.currentThread().getName() &#43; ":完成任务");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}static class Task extends Thread{private DoSomething doSomething;public Task(DoSomething doSomething){this.doSomething &#61; doSomething;}&#64;Overridepublic void run() {doSomething.doSome();}}}

执行结果如下&#xff1a;

可以看出&#xff1a;每次只能有两个线程并行执行&#xff0c;正如前面所说&#xff0c;它的作用就是控制同时访问资源的线程个数&#xff0c;一次只允许permits个线程访问。

 


推荐阅读
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 状态模式在软件设计中的应用与实现
    本文以酒店管理系统为例,探讨了状态模式在软件设计中的应用与实现。酒店房间的状态包括空闲、已预订和已入住,这些状态之间可以相互转换。通过引入状态模式,系统能够更加灵活地管理和响应不同状态下的操作,提高了代码的可维护性和扩展性。此外,状态模式还简化了状态转换的逻辑处理,使得系统的整体架构更为清晰和高效。 ... [详细]
  • 利用C#技术实现Word文档的动态生成与编辑
    本文通过一个简单的示例,介绍了如何使用C#语言实现Word文档的动态生成与编辑功能。文章详细阐述了在项目中引用Word动态库的方法,并通过具体代码示例展示了如何创建和操作Word表格。此内容旨在为初学者提供参考和学习资料,欢迎读者提出宝贵意见和建议。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在Java中,使用`java.awt.Frame`类可以轻松创建窗口,并通过简单的方法设置窗口标题。本文详细介绍了如何在自定义的`BallGame`类中扩展`Frame`类,并实现窗口的创建与标题设置。通过示例代码展示了具体实现步骤,帮助开发者快速掌握这一基础技能。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。 ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
author-avatar
想太多先生的微博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有