Coach店一般只允许保持不超过某个特定数量的顾客在店里,其余的顾客要在店外等候,直到店里有顾客出来才允许进入,Java中的Semaphore信号量的用法和这个场景非常相似,下面使用Semaphore仿真顾客逛Coach店的场景。
(1)顾客类Guest:
package coachStore;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class Guest implements Runnable
{
//Coach店一次允许进入的顾客数量
private static final int SIZE = 10;
private static int count = 0;
private int id = count++;
//允许SIZE个顾客同时访问的信号量
private static Semaphore room = new Semaphore(SIZE, true);
private int shoppingTime;
public Guest(int shoppingTime)
{
this.shoppingTime = shoppingTime;
}
public void run()
{
try
{
System.out.println("Guest " + id + " is waiting for entering the store");
//顾客等待进入Coach店,如果店里的顾客已满,则等待(阻塞)
room.acquire();
System.out.println("Guest " + id + " entered the store and started to look around");
//线程睡眠以模拟顾客在店里逛的动作
TimeUnit.SECONDS.sleep(shoppingTime);
//顾客离开时需要签离,释放一个位置
room.release();
System.out.println("Guest " + id + " stayed for " + shoppingTime + " seconds and left");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
(2)main类:
package coachStore;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CoachStoreDemo
{
//所有顾客的数量
final static int GUEST_QUANTITY = 100;
private static Random rand = new Random(47);
public static void main(String[] args)
{
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < GUEST_QUANTITY; i++)
{
//随机生成一个0到10之间的数字表示顾客在店里逗留的时间,启动一个顾客线程
exec.execute(new Guest(rand.nextInt(10)));
}
}
}
分享到:
相关推荐
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
使用信号量,可以实现多个读者同时读取,而写入时阻塞所有读写操作。 - **哲学家就餐问题**:五个哲学家围坐一桌,每个人需要同时拿起左右两边的筷子才能吃饭。通过信号量,可以防止他们同时拿起筷子导致死锁。 在...
Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...
在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二进制信号量和计数信号量。 1. **信号量的原理**: - 信号量是一个整数值,表示可用资源的数量。当线程需要使用资源时,...
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
Java并发编程Semaphore计数信号量详解 Java并发编程中,Semaphore(信号量)是一种高效的同步机制,允许一定数量的线程访问某个资源。在本文中,我们将详细介绍Java并发编程Semaphore计数信号量的工作原理和应用。 ...
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要。它通过控制共享资源的访问来避免竞态条件,确保数据的一致性。信号量本质上是...
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
资源包含了vxworks多任务(task和semaphore信号量及事件)的相关编程例子,通过创建多任务的简单例子,帮助大家了解taskSpawn函数、信号量semaphore、以及事件event的使用方法。
下面是一个简单的Java Semaphore使用示例,模拟了一个只有两个车位的停车场: ```java import java.util.concurrent.Semaphore; public class ParkingLot { private Semaphore semaphore = new Semaphore(2); ...
Java 信号量Semaphore的实现 Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的...
在Java中,我们可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建一个信号量时,可以指定初始许可证的数量。以下是一个简单的示例: ```java import java.util.concurrent.Semaphore; public class ...
以下是一个简单的例子,展示了如何使用信号量来控制同时执行的任务数量。在这个例子中,我们创建了一个信号量,初始值为2,然后启动了3个并发任务。每个任务在执行前都会调用`dispatch_semaphore_wait`获取信号量,...
在使用信号量时,需要注意信号量的初始化和释放,确保信号量的正确使用。同时,也需要注意信号量的分类和操作,以便更好地使用信号量。 信号量是一种重要的同步机制,在多线程环境下可以用于保证资源的安全使用。...
我们不仅需要使用互斥锁来保护队列的访问,还需要使用信号量来确保队列不会溢出或空闲。 ```plaintext // 初始化信号量 int empty = N; int full = 0; // 生产者函数 void producer() { while (true) { ...
以下是一个简单的MFC工程中使用信号量的步骤: 1. 定义信号量:在类中声明一个`HANDLE`类型的成员变量,用于存储信号量句柄。 2. 初始化信号量:在类的构造函数中,调用`CreateSemaphore`函数初始化信号量,指定...
Semaphore(信号量)是一种经典的同步机制,它源自于荷兰计算机科学家Edsger W. Dijkstra提出的银行家算法。本示例中,我们将深入探讨如何使用Semaphore来控制多线程的循序执行。 Semaphore是一种计数信号量,它...
在Java中,可以自定义一个名为`mySemaphore`的类来模拟信号量。这个类通常包含两个核心方法:`P()`(代表"PROCedure"或"Pass")和`V()`(代表"VERSus"或"Value increment")。`P()`方法用于尝试获取资源,如果资源不...
这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.semaphore信号量原理 多线程同时运行,能提高程序的...