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

相关文章

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说