zoukankan      html  css  js  c++  java
  • Semaphore实现信号灯

    Direction

    Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。

    Semaphore实现的功能就类似打印店有5台打印机,假如有10个人要打印文件,那么同时也能有几个人打印呢?同时只能有5个人占用打印机,当5个人中任何一个人使用完成后,其他在等待的5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。

    单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

    Example

     1 public class SemaphoreTest {
     2     public static void main(String[] args) {
     3         ExecutorService service = Executors.newCachedThreadPool();
     4         final  Semaphore sp = new Semaphore(3);
     5         for(int i=0;i<10;i++){
     6             Runnable runnable = new Runnable(){
     7                     public void run(){
     8                     try {
     9                         sp.acquire();
    10                     } catch (InterruptedException e1) {
    11                         e1.printStackTrace();
    12                     }
    13                     System.out.println("线程" + Thread.currentThread().getName() + 
    14                             "进入,当前已有" + (3-sp.availablePermits()) + "个并发");
    15                     try {
    16                         Thread.sleep((long)(Math.random()*10000));
    17                     } catch (InterruptedException e) {
    18                         e.printStackTrace();
    19                     }
    20                     System.out.println("线程" + Thread.currentThread().getName() + 
    21                             "即将离开");                    
    22                     sp.release();
    23                     //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
    24                     System.out.println("线程" + Thread.currentThread().getName() + 
    25                             "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");                    
    26                 }
    27             };
    28             service.execute(runnable);            
    29         }
    30     }
    31 }
  • 相关阅读:
    每位设计师都应该拥有的50个CSS代码片段-1
    JS OO库的选择
    Dean Edwards -- Base.js(译)
    Jquery中find、filter等几种用法的差异
    深入Java虚拟机读书笔记第三章安全
    深入Java虚拟机读书笔记第二章平台无关性
    深入Java虚拟机读书笔记第一章Java体系结构介绍
    ThinkInJava4读书笔记之第七章隐藏实施过程
    Java反射机制(转载)
    linux常用svn命令(转载)
  • 原文地址:https://www.cnblogs.com/shen-smile/p/5145774.html
Copyright © 2011-2022 走看看