package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* 操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java并发库的Semaphore可以很轻松完成信号量控制,
* Semaphore可以控制某个资源可被同时访问的个数
* ,acquire()获取一个许可,如果没有就等待,而release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。
* Semaphore维护了当前访问的个数
* ,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表
* 。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。
* 下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。
*
* Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中
* 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,
* 这取决于构造Semaphore对象时传入的参数选项
* 。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
*
* @author lhj
*
*/
public class TestSemaphore {
public static void main(String[] args) {
// 线程池
ExecutorService exec = Executors.newCachedThreadPool();
// 只能5个线程同时访问
final Semaphore semp = new Semaphore(5);
// 模拟20个客户端访问
for (int index = 0; index < 20; index++) {
final int NO = index;
Runnable run = new Runnable() {
public void run() {
try {
// 获取许可
semp.acquire();
System.out.println("Accessing: " + NO);
Thread.sleep((long) (Math.random() * 10000));
// 访问完后,释放
semp.release();
System.out.println("-----------------"+semp.availablePermits());
} catch (InterruptedException e) {
}
}
};
exec.execute(run);
//exec.submit(run);
}
// 退出线程池
exec.shutdown();
}
}
分享到:
相关推荐
Semaphore进程间通讯测试源码,CreateSemaphoreW,OpenSemaphore,ReleaseSemaphore,WaitForSingleObjectEx
使用Kotlin编写的Semaphore测试程序
这是一个示例应用程序和CI / CD管道,展示了如何使用Semaphore 2.0将微服务构建,测试和部署到Kubernetes。 配料: Ruby Sinatra作为Web框架 RSpec测试 打包在Docker容器中 容器被推送到Docker Hub注册表 部署到...
Semaphore 是一个简单的 Python/Tkinter 应用程序,可帮助监控来自给定命令的状态。 我主要将它用于单元测试。 我把这个小窗口放在我的周边视觉看到发生了什么的地方,因为我并不总是想知道测试失败的确切原因,我...
只有一个数据库实体和一个对应的存储库测验测试分为两个类路径(以便将它们作为单独的任务运行): 保存单元测试包含集成测试,在这种情况下为存储库和其余端点测试。信号量上的CI / CD管道信号量管道配置为: 建立...
这是一个示例应用程序和CI / CD管道,显示了如何使用Semaphore 2.0将无服务器微服务构建,测试和部署到Google Cloud Run。 配料: Ruby Sinatra作为Web框架 RSpec测试 打包在Docker容器中 容器已推送至Google ...
然后根据.semaphore/semaphore.yml运行代码扫描和自动测试。 信号量上的CI / CD 如果您不熟悉Semaphore,请随意此存储库并使用它来。 CI管道如下所示: 您可以通过阅读来跟随该项目。 或直接跳到.semaphore/...
这是一个示例项目和CI / CD管道,显示了如何使用Semaphore 2.0构建,测试和部署Android应用程序。 信号量上的CI / CD 如果您不熟悉Semaphore,请随意此存储库并使用它来。 项目设置 创建一个并更新。 创建一个...
示例应用程序和CI / CD管道显示了如何在Semaphore 2.0上运行JavaScript项目。 项目由基于Nest.js的Node.js服务器和React客户端组成。 代码是用TypeScript编写的。 信号量上的CI / CD 分叉此存储库并使用它来。 CI...
使用React Native的信号量演示CI / CD管道示例应用程序和CI / CD管道显示了如何在Semaphore 2.0上运行React Native项目。 使用。信号量上的CI / CD 分叉此存储库并使用它来。 CI管道将如下所示: 要仅运行iOS CI,请...
示例如何构建一个无服务器API函数并使用Semaphore将其部署到Zeit Now。 信号量上的CI / CD 分叉此存储库并使用它来。 转到您的即时信息中心,然后。 您应该在页面中间看到一个稍微隐藏的字段,上面写着“通过输入...
在真实设备或Semaphore上运行示例应用程序之前,您需要配置代码签名。 首先,您将需要配置Xcode项目以使用您的开发团队。 打开TallestTowers.xcodeproj并为每个TallestTowers , TallestTowersTests , ...
gem install semaphore_test_boosters 什么是测试助推器 测试助推器采用您的测试套件,并将测试文件拆分为多个作业。 这使您可以在多台构建机之间快速并行化测试套件。 例如,让我们看一下rspec_booster --job 1/10...
带有 Docker 和 Kubernetes 的 CI/CD 配套演示书 在您的工作站中运行它 $ docker-compose up --build ...注册 Semaphore 并安装 。 将项目添加到信号量: $ sem init 部署到云端 需要的云服务: K
内核目前处于测试阶段,现在发布运行在 stm32 处理器上的第一个测试版本。 主要特点 IPC 支持常见IPC机制,semaphore\mailbox\message、mutex、eventset 充分总结各种机制的共性和特性,基于通用IPC控制结构和...
进程间通讯不仅指进程之间传递一些message, 还包括进程之间的合作等。...5.信号量(semaphore) 6.套接口(Socket) 各种手段的详细说明请参考《unix进程通信+》 我们主要对共享内存方式进行学习:
此代码使用Webpack设置Angular 2项目是一种简单的方法,同时还提供了单元测试的配置。 要安装所有依赖项,请运行: npm i 对于单项无头测试,请使用: npm run test:headless 要在浏览器用户中运行代码: npm ...
Karma 的主要目标是为开发人员提供高效的测试环境。 该环境是他们不必设置大量配置的环境,而是开发人员只需编写代码并从他们的测试中获得即时反馈的地方。... 与 Jenkins、Travis 或 Semaphore 的简单集成。
Karma的主要目标是为开发人员带来一个高效的测试环境。 在这种环境中,他们不必设置大量的配置,而在这里,开发人员可以编写代码并从测试中获得即时反馈。... 与Jenkins,Travis或Semaphore的简单集成。