zoukankan      html  css  js  c++  java
  • Java多线程与并发库高级应用之信号量Semaphore

    JDK1.5提供了一个计数信号量Semaphore类。Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,并提供了同步机制。

    Semaphore提供了两个构造器来创建对象:

    1)Semaphore(int permits):创建具有给定的许可数和非公平的公平设置的Semaphore。
    2)Semaphore(int permits, boolean fair):创建具有给定的许可数和给定的公平设置的Semaphore。如果此信号量保证在争用时按先进先出的顺序授予许可,则为true,否则为false。

    如果线程要运行首先要获取信号量,调用信号量的acquire()方法。当某线程执行完后要释放信号量,调用信号量的release()方法。


    实现一个同时只允许3个线程并发访问的程序。
    1. public class SemaphoreDemo {  
    2.   
    3.     public static void main(String[] args) {  
    4.           
    5.         //定义一个信号数为3的信号量  
    6.         final Semaphore semaphore = new Semaphore(3);  
    7.         //线程池  
    8.         ExecutorService pool = Executors.newCachedThreadPool();  
    9.           
    10.         //创建10个线程  
    11.         for(int i = 0; i < 10; i++){  
    12.             Runnable target = new Runnable(){  
    13.                 @Override  
    14.                 public void run() {  
    15.                     try {  
    16.                         //获取信号量  
    17.                         semaphore.acquire();  
    18.                     } catch (InterruptedException e) {  
    19.                         e.printStackTrace();  
    20.                     }  
    21.                     System.out.println("线程-" + Thread.currentThread().getName() +  
    22.                             "-已进入,当前已有" + (3-semaphore.availablePermits()) + "个线程并发");  
    23.                     try {  
    24.                         Thread.sleep(1000);  
    25.                     } catch (InterruptedException e) {  
    26.                         // TODO Auto-generated catch block  
    27.                         e.printStackTrace();  
    28.                     }  
    29.                     System.out.println("线程-" + Thread.currentThread().getName() +  
    30.                             "-准备离开,当前已有" + (3-semaphore.availablePermits()) + "个线程并发");  
    31.                     //释放信号量  
    32.                     semaphore.release();  
    33.                     System.out.println("线程-" + Thread.currentThread().getName() +  
    34.                             "-离开,当前已有" + (3-semaphore.availablePermits()) + "个线程并发");  
    35.                 }  
    36.             };  
    37.             pool.execute(target);  
    38.         }  
    39.         pool.shutdown();  
    40.     }  
    41.   
    42. }  

    运行程序,看到同时只有3个线程并发执行。
  • 相关阅读:
    【转】SVN linux命令及 windows相关操作(二)
    【转】SVN linux命令及 windows相关操作(一)
    spring框架DI(IOC)和AOP 原理及方案
    [转载]JVM性能调优--JVM参数配置
    JVM性能调优-GC内存模型及垃圾收集算法
    密码运算API(GP Internal API)
    时间API(GP Internal API)
    可信存储API(GP Internal API)
    内存管理函数(GP Internal API)
    Panic(GP Internal API)
  • 原文地址:https://www.cnblogs.com/sfce/p/3701641.html
Copyright © 2011-2022 走看看