`

Semaphore 使用案例

阅读更多

   Semaphore即信号量,可以被多个线程获取,下面是一个具体的例子,和Lock配合使用,模拟有三台打印机,一次允许三个线程使用空闲的打印机,代码如下:

package thread;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created with IntelliJ IDEA.
 * User: malone
 * Date: 14-4-10
 * Time: 上午10:39
 * To change this template use File | Settings | File Templates.
 */
public class SemaphoreDemo {

    public static void main (String[] args) {
        Storge storge = new Storge();
        for (int i = 0; i < 12; i++) {
            new MyThread(storge).start();
        }
    }
}

class Storge {

    private volatile Boolean[] printer;

    private Semaphore semaphore;

    private Lock lock;

    Storge () {
        semaphore = new Semaphore(3);
        printer = new Boolean[3];
        for (int i = 0; i < printer.length; i++) {
            printer[i] = true;
        }
        lock = new ReentrantLock();
    }

    public int getFreePrinter () {
        lock.lock();
        try {
            for (int i = 0; i < printer.length; i++) {
                if (printer[i]) {
                    printer[i] = false;
                    return i;
                }
            }
        } finally {
            lock.unlock();
        }
        return -1;
    }

    public void setPrinter (int i) {
        lock.lock();
        try {
            printer[i] = true;
        } finally {
            lock.unlock();
        }
    }

    public void print () {
        try {
            //获取信号量
            semaphore.acquire();
            int freePrinter = getFreePrinter();
            System.out.println("Thread " + Thread.currentThread().getName() + " 正在使用"  + freePrinter + "号打印机");
            Thread.sleep(1000);
            setPrinter(freePrinter);
            System.out.println("Thread " + Thread.currentThread().getName() + " 释放"  + freePrinter + "号打印机");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }

    }


}

class MyThread extends Thread {
    private Storge storge;

    MyThread (Storge storge) {
        this.storge = storge;
    }

    public void run () {
        storge.print();
    }

}


 

分享到:
评论

相关推荐

    mutex和semaphore互斥程序实例

    例如,使用`std::binary_semaphore`实现一个允许两个线程并发访问的资源池: ```cpp #include #include #include &lt;semaphore&gt; std::binary_semaphore sem(2); // 初始化为2,允许两个线程同时访问 void access_...

    C#语言Semaphore类用法实例(多线程多端口使用端口控制)

    在这个实例中,我们关注的是如何利用Semaphore来管理多线程对多个端口的访问,确保不会出现冲突。Semaphore类可以看作是一个计数器,它维护着一个固定数量的许可证。当一个线程请求一个许可证并获得它时,计数器减一...

    semaphore控制多线程循序执行

    1. 初始化Semaphore:创建一个Semaphore实例,传入初始许可数量。如果设置为1,那么只有一个线程可以获取许可并执行任务,从而实现串行化执行。 ```java Semaphore semaphore = new Semaphore(1); // 创建一个只...

    Semaphore进程间通讯测试源码

    `WaitForSingleObjectEx`是一个等待函数,它能让调用进程暂停执行,直到指定的对象(在这个案例中是Semaphore)变为有信号状态或者超时。该函数的参数包括Semaphore句柄、等待时间以及是否被中断。如果Semaphore的...

    Semaphore 源码解析

    1. `Semaphore(int permits)`和`Semaphore(int permits, boolean fair)`构造器:根据传入的参数创建非公平锁或公平锁实例。`permits`表示初始的许可数。 2. `Sync`抽象静态类:继承自AQS,内部实现了Semaphore的...

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

    2. `SemaphoreService`是核心代码类,它包含了一个`Semaphore`实例,初始化时传入的参数为1,这意味着在同一时刻只有一个线程可以执行`doSomething`方法。`doSomething`方法使用`acquire()`来获取许可证,然后执行...

    pc_semaphore.zip_pc_semaphore

    "pc_semaphore.zip_pc_semaphore"这个压缩包文件,显然与线程同步机制有关,特别是使用信号量(Semaphore)解决读者-写者问题。信号量是一种在多线程环境中用于控制对共享资源访问的机制,可以防止多个线程同时访问...

    Java并发编程之Semaphore(信号量)详解及实例

    Java并发编程之Semaphore(信号量)详解及实例 在 Java 中,Semaphore(信号量)是一种非常有用的并发编程工具,主要用于控制访问某些资源的线程数目。下面,我们将详细介绍 Semaphore 的原理、实现和实例。 ...

    Laravel开发-semaphore

    在这个特定的案例中,我们关注的是一个专为 Laravel 4.2 设计的包,它简化了与 Semaphore API 的集成过程。 首先,我们需要了解 Laravel 框架。Laravel 是 PHP 的一款流行开源 Web 应用框架,以其优雅的语法和强大...

    JAVA 多线程之信号量(Semaphore)实例详解

    **JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...

    C#使用semaphore来管理异步下载请求的方法

    首先,创建一个`Semaphore`实例: ```csharp var semaphor = new Semaphore(50, 50); ``` 然后,定义一个列表`resultPins`来存储下载结果。接下来,遍历需要下载的`pinIdList`集合,对于每个PIN ID,都会执行以下...

    C++中Semaphore内核对象用法实例

    本文实例讲述了C++中Semaphore内核对象的用法,分享给大家供大家参考。具体方法如下: 代码如下:// Semaphore.cpp : 定义控制台应用程序的入口点。  //    #include “stdafx.h”  #include   #include     ...

    Python多线程同步Lock、RLock、Semaphore、Event实例

    例如,当需要限制并发访问的资源数量时,可以使用Semaphore;当需要确保某个操作的原子性时,使用Lock或RLock;而Event则适用于简单的同步或通知机制。 值得注意的是,虽然Python的多线程在CPU密集型任务上可能表现...

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

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...

    SQL Server RESOURCE_SEMAPHORE 等待状态

    总的来说,当遇到RESOURCE_SEMAPHORE等待状态时,需要深入了解查询的内存需求,分析并优化内存使用,以确保SQL Server实例能够高效地运行。同时,建立性能基线,定期监控等待状态,是预防和解决此类问题的关键。

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

    以下将详细讲解C#中多线程的基本使用、线程互斥以及相关的实例。 一、多线程基本使用 在C#中,创建和管理线程主要依赖于`System.Threading`命名空间中的`Thread`类。通过实例化`Thread`类并传入一个`ThreadStart`...

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

    本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。以下是这些实例可能涉及的关键知识点: 1. **线程创建**:C#中创建线程主要有两种方式,一是通过`System.Threading.Thread`...

    c语言信号量的使用实例

    ### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要。它通过控制共享资源的访问来避免竞态条件,确保数据的一致性。信号量本质上是...

Global site tag (gtag.js) - Google Analytics