`

Semaphore使用方法(三)

阅读更多
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();
    }
}

 

0
0
分享到:
评论

相关推荐

    pthread.h sched.h semaphore.h 三个头文件

    标题提到的"pthread.h"、"sched.h"和"semaphore.h"是三个在多线程编程和进程调度中常用的头文件,特别是在Linux和类Unix系统中。然而,这里我们看到这些文件在Windows环境下使用Cygwin进行darknet编译时也有所需求。...

    java并发核心Semaphore 的使用思路.docx

    `doSomething`方法使用`acquire()`来获取许可证,然后执行业务逻辑,最后通过`release()`释放许可证。`acquire()`会使当前线程阻塞,直到获取到许可证,而`release()`则会释放一个许可证,可能唤醒正在等待的线程。 ...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在实际使用中,根据具体需求选择合适的方法,如CountDownLatch适用于一个线程等待多个线程的场景,CyclicBarrier适合多个线程协作执行多阶段任务,而Semaphore则可以用于限制资源的并发访问。 在深入理解这些工具的...

    Java 信号量Semaphore的实现

    在main()方法中,我们创建了一个固定大小的线程池,用于执行R1、R2、R3这三个Runnable对象,然后,我们使用execute()方法来执行这三个Runnable对象多次。由于三个Semaphore对象的计数器初始值不同,因此三个Runnable...

    如何使用CSemaphore类

    2. 请求访问:在需要访问共享资源的线程中,使用Acquire()或WaitOne()方法尝试获取信号量。 ```cpp if (semaphore.Acquire(0) != WAIT_OBJECT_0) { // 无法获取信号量,可能需要等待 } ``` 3. 使用资源:获取到...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    在实际应用中,这三个工具类可以灵活组合使用,以满足复杂的并发控制需求。例如,CountDownLatch可以用于确保所有参与者准备好后再开始一个活动,Semaphore可以限制并发访问特定资源的线程数量,而Exchanger则可以在...

    线程同步的四种详细使用方法--临界区、互斥量、事件等

    事件(Event)是第三种常用的线程同步方法,它是一种同步对象,可以用来同步多个线程的执行。事件可以用 CreateEvent()函数创建,并用 WaitForSingleObject()函数等待事件的触发。事件可以用来同步多个线程的...

    让线程按顺序执行8种方法.doc

    三、使用线程的wait方法 wait()是Object的方法,作用是让当前线程等待其他线程的唤醒。应用场景:当一个线程需要等待其他线程的结果时可以使用wait()方法。 四、使用线程的线程池方法 线程池是一种多线程编程技术...

    ITRON系统使用方法

    ### ITRON系统使用方法详解 #### ITRON系统概览及重要特性 **ITRON系统**,全称为**Industrial the Real-Time Operation System Nucleus**(工业实时操作系统中心),是一种专门为小型嵌入式系统设计的实时操作...

    effecctivejava 第三版中文

    15. **并行和并发**:理解线程安全的概念,使用并发工具类如ExecutorService、Semaphore等,避免并发问题。 这些只是《Effective Java》第三版中的一部分主题,全书涵盖了大量关于如何编写高质量Java代码的实用建议...

    linux信号量的源码例子

    首先,我们来看看如何在C语言中使用`&lt;semaphore.h&gt;`头文件来操作信号量: 1. **创建信号量**:使用`sem_init()`函数创建一个内核级信号量。如果是在进程间共享,需要传递第三个参数为非零值。例如: ```c sem_t sem...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Semaphore类中最重要的三个方法是: 1. public void acquire() throws InterruptedException {}; //获得一个许可 2. public boolean tryAcquire() {}; //尝试获得一个许可 3. public void release() {}; //释放一个...

    VC多线程编程的常用三种方法

    本篇文章将详细阐述VC++中实现多线程的三种常见方法:使用`CreateThread`函数、`_beginthread`/`_beginthreadex`函数以及基于`std::thread`的C++11标准库方法。 1. **使用CreateThread函数** Windows API提供的`...

    Java 信号量编程实践

    **三、使用场景** 1. **限制并发访问**:例如在数据库连接池中,可以使用Semaphore限制同时的数据库连接数量,防止过多的并发连接导致数据库压力过大。 2. **资源池管理**:在分布式系统中,如任务调度系统,可以...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    使用`ThreadPool.QueueUserWorkItem`方法提交任务。 ```csharp ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod)); ``` 2. 异步编程模型:C# 4.0引入了`async/await`关键字,使得异步编程更加简洁。`...

    线程、多线程和线程池面试专题.docx

    1. 使用Semaphore控制线程的并发访问:创建Semaphore变量,Semaphore semaphore = new Semaphore(5,true);当方法进入时,请求一个信号,如果信号被用完则等待,方法运行完,释放一个信号,释放的信号新的线程就可以...

    ITRON系统使用方法介绍及快速入门

    ### ITRON系统使用方法介绍及快速入门 #### 一、ITRON系统概要 **ITRON**(Industrial the Real-Time Operation System Nucleus,工业实时操作系统中心)是一种专为小型嵌入式系统设计的标准实时操作系统规范。它...

    C#函数方法集,汇总c#.net常用函数和方法集

    使用`try...catch...finally`进行异常处理,`throw`用于抛出异常,`using`语句常用于资源管理,确保资源在使用后被正确释放。 5. **集合与LINQ** `List&lt;T&gt;`、`Dictionary, TValue&gt;`等集合类型提供数据存储。LINQ...

    线程三个随机数

    线程之间的通信可能通过共享变量、锁(如`Monitor`、`Mutex`或`Semaphore`)或者线程安全的数据结构(如`ConcurrentQueue`或`ConcurrentStack`)来实现,以确保数据的一致性和完整性。 接着,随机数的生成。在...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    11.1.3 第三步:定义负责引发事件的方法来通知事件的登记对象 11.1.4 第四步:定义方法将输入转化为期望事件 11.2 编译器如何实现事件 11.3 设计侦听事件的类型 11.4 显式实现事件 第12章 泛型 12.1 ...

Global site tag (gtag.js) - Google Analytics