浅谈Semaphore类
Semaphore类有两个重要方法
1、semaphore.acquire();
请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire
2、semaphore.release();
释放一个信号量,这时候信号量个数+1,
这个类使用的目的为:
如何控制某个方法允许并发访问线程的个数?
也就是说在线程里执行某个方法的时候,在方法里用该类对象进行控制,就能保证所有的线程中最多只有指定信号量个数个该方法在执行。
举例:
我开启了100个线程,执行一个showLog()方法,但是我只想要所有线程中,最多有五个线程在执行该方法,其他的线程就必须排队等待。
则可以使用Semaphore对象进行控制,该对象new初始化的时候有个int参数,即指定最多信号量个数。
private Semaphore semaphore; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); semaphore = new Semaphore(5); for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { showLog(); } }).start(); } } private void showLog(){ try { semaphore.acquire(); Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个acquire请求操作"); } catch (InterruptedException e) { e.printStackTrace(); } // 线程休眠1s try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } semaphore.release(); Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作"); }
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:
JAVA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?