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进程间通讯测试源码"中,我们可以看到如何在MFC(Microsoft Foundation Classes)框架下利用Semaphore实现进程间的通信。MFC是微软提供的一套C++类库,方便开发者构建Windows应用程序。 `...
5. **测试与监控**:在生产环境部署前,务必在测试环境中验证配置和 playbook。启用日志记录和监控功能,以便于排查问题和优化性能。 通过以上步骤,你将能够利用提供的资源成功搭建一个基于 Semaphore 的可视化工...
Semaphore是一款强大的持续集成/持续部署(CI/CD)工具,主要设计用于自动化软件构建、测试和部署流程。在这个"semaphore-develop.zip"压缩包中,包含的应该是Semaphore的开发源码,这对于理解其内部工作原理、自定义...
5. **多环境支持**:你可以为不同的环境(如开发、测试、生产)设置不同的主机列表,方便切换。 6. **通知集成**:Semaphore 可以与 Slack、邮件等服务集成,实时通知任务执行状态。 7. **易于部署**:Semaphore ...
此外,考虑到系统的复杂性和可能的并发问题,开发者还需充分测试,确保通信机制的稳定性和安全性。信号量+共享存储区的IPC方案,尤其适用于需要频繁数据交换且对性能有高要求的应用场景,如实时数据处理系统、分布式...
根据提供的信息,我们可以深入探讨Semaphore_TBOX产品的软件及系统功能,特别是TBoxRTU的相关细节。这是一款专门针对工业自动化领域的远程终端单元(RTU),它不仅具备强大的数据采集能力,还集成了先进的软件工具,使...
7. **持续集成/持续部署 (CI/CD)**:Semaphore 不仅是一个 Ansible 管理工具,还可以与 Git 等版本控制系统集成,实现自动化测试和部署流程,这对于现代 DevOps 工作流非常有价值。 在 "semaphore-2.8.22" 文件夹中...
这是一个示例应用程序和CI / CD管道,展示了如何使用Semaphore 2.0将微服务构建,测试和部署到Kubernetes。 配料: Ruby Sinatra作为Web框架 RSpec测试 打包在Docker容器中 容器被推送到Docker Hub注册表 部署到...
Semaphore 是一个简单的 Python/Tkinter 应用程序,可帮助监控来自给定命令的状态。 我主要将它用于单元测试。 我把这个小窗口放在我的周边视觉看到发生了什么的地方,因为我并不总是想知道测试失败的确切原因,我...
并发编程是多线程环境下确保程序正确执行的...而CountDownLatch则用于线程间的协调,让一个线程等待其他线程完成任务,常用于启动框架服务、多线程测试等场景。熟练掌握这两种工具,能有效提升并发程序的效率和正确性。
`Mutex`, `Semaphore`, `Monitor`, `lock`关键字等都是C#提供的同步机制。例如,使用`lock`关键字可以确保同一时间只有一个线程能访问特定的代码块: ```csharp private static object lockObject = new object(); ...
在IT行业中,尤其是在软件开发领域,测试并发性能是至关重要的环节。并发编程允许程序同时执行多个任务,从而提高系统效率和资源利用率。C#作为.NET框架的主要编程语言,提供了丰富的工具和特性来支持并发编程。下面...
3. **多线程**:了解线程的概念,掌握Thread类和Runnable接口,知道同步机制(synchronized关键字,wait/notify机制,Lock接口等)以及并发工具类如ExecutorService、Semaphore、CountDownLatch等。 4. **Java测试...
只有一个数据库实体和一个对应的存储库测验测试分为两个类路径(以便将它们作为单独的任务运行): 保存单元测试包含集成测试,在这种情况下为存储库和其余端点测试。信号量上的CI / CD管道信号量管道配置为: 建立...
为了防止数据冲突,需要使用同步机制,如互斥量(mutex)、信号量(semaphore)或者临界区(critical section)。`MiniSpy.clw`文件可能是线程类的定义,包含了线程启动、执行任务以及与主线程通信的相关方法。 ...
Semaphore 2.0 是一款强大的持续集成和持续部署(CI/CD)平台,它帮助企业或个人开发者高效地构建、测试和发布软件。Semaphore 2.0 的文档详细介绍了如何使用该服务来自动化软件开发流程,确保代码质量和快速迭代。...
这是一个示例应用程序和CI / CD管道,显示了如何使用Semaphore 2.0将无服务器微服务构建,测试和部署到Google Cloud Run。 配料: Ruby Sinatra作为Web框架 RSpec测试 打包在Docker容器中 容器已推送至Google ...
然后根据.semaphore/semaphore.yml运行代码扫描和自动测试。 信号量上的CI / CD 如果您不熟悉Semaphore,请随意此存储库并使用它来。 CI管道如下所示: 您可以通过阅读来跟随该项目。 或直接跳到.semaphore/...
5. **多线程**:学习Thread类和Runnable接口,同步机制(如synchronized关键字、wait()、notify()和notifyAll()方法),以及并发工具类如Semaphore、CountDownLatch等。 6. **集合框架**:熟悉ArrayList、...
4. **非阻塞同步替代方案**:Java提供了多种非阻塞同步机制,如`java.util.concurrent`包中的`ReentrantLock`、`Semaphore`和`Atomic`类等。这些工具可以在某些情况下提供更好的性能,但使用它们需要更深入的理解和...