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互斥程序实例
C#语言Semaphore类用法实例,多线程 用于有多个同类型共享资源(比如端口)时,如何协调端口分配给线程访问资源的问题,是一个简单模拟实例(源代码)。
主要介绍了Java并发编程之Semaphore(信号量)详解及实例的相关资料,需要的朋友可以参考下
主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池。 Event : 是最简单的线程间通信的方式,一个线程可以发送信号,其他的线程接收到信号后执行操作。 二、实例 1)Lock & RLock Lock对象的状态可以...
本文实例讲述了C++中Semaphore内核对象的用法,分享给大家供大家参考。具体方法如下: 代码如下:// Semaphore.cpp : 定义控制台应用程序的入口点。 // #include “stdafx.h” #include #include ...
Semaphore产品行业解决方案pdf,Semaphore产品行业解决方案
1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...
当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态。好的方法是一开始建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在内存压力的话,要找出是什么原因导致的。可以检查事务...
允许您使用MySQL在群集的Node.js环境中生成信号量。 这对于诸如cron作业或长时间运行的任务等只希望在单个实例上发生的事情很有用。 要求:MySQL服务器 安装 npm install mysql-semaphore --save 初始化: 有关...
这个实例不仅有界面编程的菜单栏编辑器和工具栏编辑器,而且还有很多你可能没用到的技术哦。 有问题,登录我的博客。
本文实例讲述了C#通过Semaphore类控制线程队列的方法。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; ...
本文实例讲述了C#使用semaphore来管理异步下载请求的方法。分享给大家供大家参考。具体实现方法如下: var semaphor = new Semaphore(50, 50); // We allow at most 50 threads for crawling var resultPins = new ...
从0.8.6版本开始,bordeaux-threads有其自己的内置信号量,因此您绝对应该使用它代替bt-semaphore。 安装 bt-semaphore可通过。 如果您好奇,还可以克隆Git存储库: cd ~/quicklisp/local-projects git clone ...
实例268——使用信号量(Semaphore)实现线程的同步 实例269——使用多线程进行文件搜索 实例270——获取当前系统的所有进程 实例271——实现应用程序在系统中只能运行一个实例 实例272——获取所有打开窗口...
同步的方法基本与多线程相同。 1) Lock 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。 复制代码 代码如下: import multiprocessing import sys def worker_with(lock, f): with lock: ...
使用共享内存实现Win32进程之间的通信实例,程序中用到了Win32程序设计中常用到的semaphore, mutex等机制,老鸟请忽略.有问题交流请与本人E-mail联系, apt_kappa@sina.com
17.4.2 Semaphore类的具体使用 394 17.5 队列 396 17.5.1 Queue接口介绍 396 17.5.2 PriorityQueue类的知识与使用 397 17.5.3 BlockingQueue接口介绍 399 17.6 阻塞的栈操作 401 17.6.1 BlockingDeque...