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个线程并发执行。
  • 相关阅读:
    高德全链路压测平台TestPG的架构与实践
    性能测试之稳定性测试(可靠性测试)
    服务端高并发分布式架构演进之路
    高性能高并发系统的稳定性保障
    聊聊服务稳定性保障这些事
    qt 待研究
    k73 uboot 和emmc启动移植
    Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)
    C++ Lambda 编译器实现原理
    qt 网络编程参考资料
  • 原文地址:https://www.cnblogs.com/sfce/p/3701641.html
Copyright © 2011-2022 走看看