常用的并发工具类( 三 )

Semaphore该类用于控制信号量的个数,可以控制同时访问资源的线程个数,并提供了同步机制 。例如,实现一个文件允许的并发访问数 。
Semaphore 的主要方法:

  • acquire():从此信号量中获取一个许可,若已超过许可量,则阻塞此请求线程 。
  • release():释放一个许可,将其返回给信号量 。
  • availablePermits():返回此信号量中当前可用的许可数 。
  • hasQueuedThreads():查询是否有线程正在等待获取 。
package test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class Test {    public static void main(String[] args) {        ExecutorService service = Executors.newCachedThreadPool();        final Semaphore sp = new Semaphore(3);   // 创建 Semaphore 信号量,初始化许可大小为3        for (int i = 0; i < 10; i++) {            try {                Thread.sleep(100);            }catch (InterruptedException e){                e.printStackTrace();            }            Runnable runnable = new Runnable() {                @Override                public void run() {                    try {                        sp.acquire();  // 请求获取许可,如果有可获取许可,则继续往下指向,许可数减一 。                    } catch (InterruptedException e){                        e.printStackTrace();                    }                    System.out.println("线程" + Thread.currentThread().getName() +                            "进入,当前已有" + (3 - sp.availablePermits()) + "个并发") ;                    try{                        Thread.sleep((long)(Math.random() * 10000));                    }catch (InterruptedException e){                        e.printStackTrace();                    }                    System.out.println("线程" + Thread.currentThread().getName() + "即将离开");                    sp.release();  // 释放许可证,许可数+1                }            };            service.execute(runnable);        }    }}


推荐阅读