java多线程学习-java.util.concurrent详解(三) Semaphore
转载于:http://janeky.iteye.com/blog/769965
我们先来学习一下JDK1.5 API中关于这个类的详细介绍:
“一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。”
我们一般用它来控制某个对象的线程访问对象
例如,对于某个容器,我们规定,最多只能容纳n个线程同时操作
使用信号量来模拟实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package com.winterbe.java8.samples.concurrent; import java.util.Collections; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /* * Semaphore通常用于对象池的控制 * */ public class TestSemaphore { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); TestSemaphore t = new TestSemaphore(); final BoundedHashSet<String> set = t.getSet(); final int MAX= 10 ; for ( int i = 0 ; i < MAX; i++) { // 十个线程同时操作add exec.execute( new Runnable() { public void run() { try { set.deal(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } }); } exec.shutdown(); } public BoundedHashSet<String> getSet() { return new BoundedHashSet<String>( 2 ); // 定义一个边界约束为2的线程 } class BoundedHashSet<T> { private final Set<T> set; private final Semaphore semaphore; final Random random = new Random(); public BoundedHashSet( int bound) { this .set = Collections.synchronizedSet( new HashSet<T>()); this .semaphore = new Semaphore(bound, true ); } public void deal(T o) throws InterruptedException { System.out.println( "availablePermits:" +semaphore.availablePermits()); semaphore.acquire(); // 信号量控制可访问的线程数目,如果访问的数量达到Bount,则阻塞 set.add(o); System.out.printf( "add:%s%n" , o); Thread.sleep(random.nextInt( 1000 )); //Sleep 一定时间后,师傅信号量,这里也就是业务逻辑处理的时间 semaphore.release(); // 释放掉信号量 System.out.printf( "remove:%s%n" , o); } } } |
总结:Semaphore通常用于对象池的控制
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络