Java 并发编程学习笔记(1) ----Semaphore-方法 acquire( int permits ) 和 release( int permits )

本文主要是介绍Java 并发编程学习笔记(1) ----Semaphore-方法 acquire( int permits ) 和 release( int permits ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Semaphore 信号量-1

1.方法 acquire( int permits ) 和 release( int permits )

方法 acquire( int permits ) 参数作用,及动态添加 permits 许可数量
表示每调用一次这个方法,使用几个permit  
new Semaphore(8) 表示初始化了 8个通路, semaphore.acquire(2) 表示每次线程进入将会占用2个通路,
semaphore.release(2) 运行时表示归还2个通路。没有通路,则线程就无法进入代码块。
没有参数时,默认等价于参数是1。

package com.lhc.concurrent.semaphore;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;public class AcquireService {private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");private Semaphore semaphore = new Semaphore(8);public void doSomething() {try {System.out.println("有线程在等待这个许可:" + semaphore.hasQueuedThreads());System.out.println("有" + semaphore.getQueueLength() + "个线程在等待");/*** 方法 acquire( int permits ) 参数作用,及动态添加 permits 许可数量* 表示每调用一次这个方法,使用几个permit  * new Semaphore(8) 表示初始化了 8个通路, semaphore.acquire(2) 表示每次线程进入将会占用2个通路,*  semaphore.release(2) 运行时表示归还2个通路。没有通路,则线程就无法进入代码块。* 没有参数时,默认等价于参数是1* */semaphore.acquire(2);System.out.println(Thread.currentThread().getName() + ":开始执行,时间:" + getFormatTimeStr());Thread.sleep(2000);System.out.println(Thread.currentThread().getName() + ":执行结束,时间:" + getFormatTimeStr());} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release(2);}}public static String getFormatTimeStr() {return sf.format(new Date());}
}

2.测试类


package com.lhc.concurrent.semaphore;public class AcquireThread extends Thread{private AcquireService acquireService;public AcquireThread(AcquireService acquireService, String name) {super();this.acquireService = acquireService;this.setName(name);}public static void main(String[] args){AcquireService acquireService = new AcquireService();for (int i = 0; i < 10; i++) {AcquireThread acquireThread = new AcquireThread(acquireService, "线程" + i);acquireThread.start();}}@Overridepublic void run() {acquireService.doSomething();}public AcquireService getAcquireService() {return acquireService;}public void setAcquireService(AcquireService acquireService) {this.acquireService = acquireService;}
}

3.测试结果

有线程在等待这个许可:false
有线程在等待这个许可:false
有0个线程在等待
有线程在等待这个许可:false
有0个线程在等待
有线程在等待这个许可:false
有0个线程在等待
有线程在等待这个许可:false
有线程在等待这个许可:false
有0个线程在等待
有0个线程在等待
有线程在等待这个许可:false
有0个线程在等待
有线程在等待这个许可:false
有线程在等待这个许可:false
有2个线程在等待
有线程在等待这个许可:false
有0个线程在等待
有3个线程在等待
有2个线程在等待
线程0:开始执行,时间:2019-04-13 11:10:27.939
线程4:开始执行,时间:2019-04-13 11:10:27.939
线程5:开始执行,时间:2019-04-13 11:10:27.939
线程3:开始执行,时间:2019-04-13 11:10:27.939
线程0:执行结束,时间:2019-04-13 11:10:29.941
线程4:执行结束,时间:2019-04-13 11:10:29.941
线程5:执行结束,时间:2019-04-13 11:10:29.941
线程2:开始执行,时间:2019-04-13 11:10:29.941
线程8:开始执行,时间:2019-04-13 11:10:29.941
线程3:执行结束,时间:2019-04-13 11:10:29.941
线程9:开始执行,时间:2019-04-13 11:10:29.941
线程1:开始执行,时间:2019-04-13 11:10:29.941
线程2:执行结束,时间:2019-04-13 11:10:31.941
线程6:开始执行,时间:2019-04-13 11:10:31.941
线程8:执行结束,时间:2019-04-13 11:10:31.942
线程1:执行结束,时间:2019-04-13 11:10:31.942
线程7:开始执行,时间:2019-04-13 11:10:31.942
线程9:执行结束,时间:2019-04-13 11:10:31.942
线程6:执行结束,时间:2019-04-13 11:10:33.941
线程7:执行结束,时间:2019-04-13 11:10:33.942

这篇关于Java 并发编程学习笔记(1) ----Semaphore-方法 acquire( int permits ) 和 release( int permits )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920913

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin