package com.yonge.lock;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* 需求:模拟一个厕所有3个坑,现在有10个人想上厕所,那么首先会有三个人进去,其他人都在外面等着,然后,三个人中有任何人先出来,那么马上又有人进去...
* @author wb-gaoy
* @version $Id: MySemaphore.java,v 0.1 2012-1-4 下午3:30:03 wb-gaoy Exp $
*/
public class MySemaphore {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
//构造三个坑
final Semaphore semaphore = new Semaphore(3);
//构造十个人
final int count = 20;
for (int i = 0; i < count; i++) {
Runnable runnable = new Runnable() {
public void run() {
try {
semaphore.acquire();
System.out.println("线程" + Thread.currentThread().getName() + "进入,当前 还有"
+ semaphore.availablePermits() + "个空坑..");
Thread.sleep((long) (Math.random() * 10000));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("线程" + Thread.currentThread().getName() + "离开,当前 还有"
+ (semaphore.availablePermits() + 1) + "个空坑..");
semaphore.release();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
分享到:
相关推荐
标题提到的"pthread.h"、"sched.h"和"semaphore.h"是三个在多线程编程和进程调度中常用的头文件,特别是在Linux和类Unix系统中。然而,这里我们看到这些文件在Windows环境下使用Cygwin进行darknet编译时也有所需求。...
`doSomething`方法使用`acquire()`来获取许可证,然后执行业务逻辑,最后通过`release()`释放许可证。`acquire()`会使当前线程阻塞,直到获取到许可证,而`release()`则会释放一个许可证,可能唤醒正在等待的线程。 ...
在实际使用中,根据具体需求选择合适的方法,如CountDownLatch适用于一个线程等待多个线程的场景,CyclicBarrier适合多个线程协作执行多阶段任务,而Semaphore则可以用于限制资源的并发访问。 在深入理解这些工具的...
在main()方法中,我们创建了一个固定大小的线程池,用于执行R1、R2、R3这三个Runnable对象,然后,我们使用execute()方法来执行这三个Runnable对象多次。由于三个Semaphore对象的计数器初始值不同,因此三个Runnable...
2. 请求访问:在需要访问共享资源的线程中,使用Acquire()或WaitOne()方法尝试获取信号量。 ```cpp if (semaphore.Acquire(0) != WAIT_OBJECT_0) { // 无法获取信号量,可能需要等待 } ``` 3. 使用资源:获取到...
在实际应用中,这三个工具类可以灵活组合使用,以满足复杂的并发控制需求。例如,CountDownLatch可以用于确保所有参与者准备好后再开始一个活动,Semaphore可以限制并发访问特定资源的线程数量,而Exchanger则可以在...
事件(Event)是第三种常用的线程同步方法,它是一种同步对象,可以用来同步多个线程的执行。事件可以用 CreateEvent()函数创建,并用 WaitForSingleObject()函数等待事件的触发。事件可以用来同步多个线程的...
三、使用线程的wait方法 wait()是Object的方法,作用是让当前线程等待其他线程的唤醒。应用场景:当一个线程需要等待其他线程的结果时可以使用wait()方法。 四、使用线程的线程池方法 线程池是一种多线程编程技术...
### ITRON系统使用方法详解 #### ITRON系统概览及重要特性 **ITRON系统**,全称为**Industrial the Real-Time Operation System Nucleus**(工业实时操作系统中心),是一种专门为小型嵌入式系统设计的实时操作...
15. **并行和并发**:理解线程安全的概念,使用并发工具类如ExecutorService、Semaphore等,避免并发问题。 这些只是《Effective Java》第三版中的一部分主题,全书涵盖了大量关于如何编写高质量Java代码的实用建议...
首先,我们来看看如何在C语言中使用`<semaphore.h>`头文件来操作信号量: 1. **创建信号量**:使用`sem_init()`函数创建一个内核级信号量。如果是在进程间共享,需要传递第三个参数为非零值。例如: ```c sem_t sem...
Semaphore类中最重要的三个方法是: 1. public void acquire() throws InterruptedException {}; //获得一个许可 2. public boolean tryAcquire() {}; //尝试获得一个许可 3. public void release() {}; //释放一个...
本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...
**三、使用场景** 1. **限制并发访问**:例如在数据库连接池中,可以使用Semaphore限制同时的数据库连接数量,防止过多的并发连接导致数据库压力过大。 2. **资源池管理**:在分布式系统中,如任务调度系统,可以...
使用`ThreadPool.QueueUserWorkItem`方法提交任务。 ```csharp ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod)); ``` 2. 异步编程模型:C# 4.0引入了`async/await`关键字,使得异步编程更加简洁。`...
1. 使用Semaphore控制线程的并发访问:创建Semaphore变量,Semaphore semaphore = new Semaphore(5,true);当方法进入时,请求一个信号,如果信号被用完则等待,方法运行完,释放一个信号,释放的信号新的线程就可以...
### ITRON系统使用方法介绍及快速入门 #### 一、ITRON系统概要 **ITRON**(Industrial the Real-Time Operation System Nucleus,工业实时操作系统中心)是一种专为小型嵌入式系统设计的标准实时操作系统规范。它...
使用`try...catch...finally`进行异常处理,`throw`用于抛出异常,`using`语句常用于资源管理,确保资源在使用后被正确释放。 5. **集合与LINQ** `List<T>`、`Dictionary, TValue>`等集合类型提供数据存储。LINQ...
线程之间的通信可能通过共享变量、锁(如`Monitor`、`Mutex`或`Semaphore`)或者线程安全的数据结构(如`ConcurrentQueue`或`ConcurrentStack`)来实现,以确保数据的一致性和完整性。 接着,随机数的生成。在...
11.1.3 第三步:定义负责引发事件的方法来通知事件的登记对象 11.1.4 第四步:定义方法将输入转化为期望事件 11.2 编译器如何实现事件 11.3 设计侦听事件的类型 11.4 显式实现事件 第12章 泛型 12.1 ...