Semaphore,译为信号量,它的作用就是维护一类可用资源,在多线程环境下保持资源竞争同步的作用。比如,一个停车场,只有三个车位,三个车位就是Semaphore,这时有10辆车要停进来,那么最多只能停进来3辆,其他的车必须等到有车离开停车场才能进去停车。直接来个程序吧。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class CarParking implements Runnable { private static final int POSITION_COUNT = 2; private int idx; private Semaphore position; public static void main(String[] args) { ExecutorService parkingLot = Executors.newCachedThreadPool(); Semaphore parkingPositions = new Semaphore(3); for (int i = 0; i < 10; i++) { parkingLot.submit(new CarParking(i, parkingPositions)); } parkingLot.shutdown(); } public void run() { try { position.acquire(); pl("车" + idx + "获得一个车位,停好了!"); Thread.sleep((long)Math.random() * 1000); pl("车" + idx + "离开停车场了!"); position.release(); } catch (InterruptedException e) { e.printStackTrace(); } } public CarParking(int idx, Semaphore position) { this.idx = idx; this.position = position; } private static void pl(Object o) { System.out.println(o); } }
运行结果如下(不一定相同):
车0获得一个车位,停好了! 车2获得一个车位,停好了! 车1获得一个车位,停好了! 车2离开停车场了! 车1离开停车场了! 车0离开停车场了! 车3获得一个车位,停好了! 车4获得一个车位,停好了! 车4离开停车场了! 车3离开停车场了! 车5获得一个车位,停好了! 车7获得一个车位,停好了! 车6获得一个车位,停好了! 车7离开停车场了! 车5离开停车场了! 车8获得一个车位,停好了! 车6离开停车场了! 车8离开停车场了! 车9获得一个车位,停好了! 车9离开停车场了!
相关推荐
<Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...
在Python和Django框架的开发过程中,可能会遇到各种错误,其中"ImportError:无法从'django.utils.encoding'导入名称'force text'"是一个常见的问题。这个错误意味着你的代码尝试从'django.utils.encoding'模块导入...
在开发基于Axis2的Web服务时,可能会遇到各种错误和异常,其中之一就是与`org.apache.axis2.util.JavaUtils.callStackToString`相关的问题。这个问题通常出现在Axis2尝试获取并打印堆栈跟踪信息时。 `...
DevExpress_Utils3_DLL文件详解 DevExpress.Utils3.DLL是DevExpress公司开发的一个组件库,主要用于Windows应用程序的开发。这个动态链接库文件包含了丰富的UI控件和工具,为开发者提供了高效、功能强大的开发支持...
import com.sun.j3d.utils.applet.MainFrame; import java.awt.BorderLayout; import com.sun.j3d.utils.universe.SimpleUniverse; import javax.media.j3d.*; import javax.vecmath.*; import ...
该dll为DevExpress控件的DevExpress.Utils3.dll
1. **时间戳处理**:在日志记录、定时任务或者事件触发器中,oslo.utils.timeutils可以简化时间的处理,确保正确的时间戳记录和处理。 2. **配置管理**:在开发需要读取配置文件的程序时,利用oslo.utils.iniparser...
import com.sun.j3d.utils.applet.MainFrame ; import java.awt.BorderLayout ; import com.sun.j3d.utils.universe.SimpleUniverse ; import javax.media.j3d.*; import javax.vecmath.*; import ...
oslo.utils 库提供了常用的工具库类的功能,例如编码,异常处理,字符串操作和时间处理。 标签:osloutils
Nuget软件包包名称Nuget版本下载数Bing.Utils Bing.Utils.DateTime Bing.Utils.Drawing Bing.Utils.Http开发环境以及类库依赖以下是我们在项目开发和部署时使用的工具和组件,这个列表会经常更新。如果没有标注版本...
《PyPI官网下载 | oslo.utils-3.42.1.tar.gz:深入解析Python实用工具库oslo.utils》 在Python的世界里,丰富的第三方库是其强大魅力的一部分。PyPI(Python Package Index)作为官方的Python软件包仓库,为开发者...
2. **数据处理**:`pyats.utils.datastructs`提供了数据结构操作工具,如列表、字典的处理,以及数据验证等功能,使得数据处理更规范和高效。 3. **配置管理**:`pyats.utils.config`可以帮助开发者读取、解析和...
import com.sun.j3d.utils.picking.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.behaviors.vp.*; import com.sun.j3d.utils.applet.MainFrame;
标题中的"PyPI 官网下载 | envoy.base.utils-0.0.11.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的开源软件包。PyPI是Python社区广泛使用的资源库,开发者可以在这里发布自己的Python软件包,供其他...
一个类似于utils包的jar包,使用感觉更方便,可以试试........
- **日志处理**: `pyats.utils.log`模块提供了自定义的日志记录功能,允许在测试过程中生成详细且结构化的日志信息,有助于调试和问题定位。 - **数据处理**: `pyats.utils.datautils`包含了一系列数据操作工具,如...
开发人员可以通过pip(Python的包管理器)来安装rcsb.utils.io,例如运行`pip install rcsb.utils.io`命令,然后在他们的Python代码中导入相关的功能。 在压缩包内,"rcsb.utils.io-0.22"很可能是包含了源代码、...
《PyPI官网下载 | zeam.utils.batch-0.2.tar.gz 深度解析》 在Python编程领域,PyPI(Python Package Index)是全球最大的Python软件仓库,它为开发者提供了一个集中发布和获取Python库的平台。"zeam.utils.batch-...
《PyPI官网下载:rcsb.utils.seq-0.49.tar.gz详解》 在Python的开发过程中,包管理器PyPI(Python Package Index)扮演着至关重要的角色,它为开发者提供了一个集中化的地方来发布、查找和安装Python库。本文将深入...
《Python库rcsb.utils.seq-0.60详解》 在Python编程领域,库的使用是提高开发效率和代码质量的重要手段。rcsb.utils.seq-0.60是一个专门用于处理序列数据的Python库,它为生物信息学中的序列操作提供了便捷的工具。...