Semaphore

Semaphore(信号量)是用来控制同时访问特定资源的线程数量。

import java.util.concurrent.*;

/**
 * Created by Administrator on 2017/5/22 0022.
 */
public class Test {

    private static final int THREAD_COUNT = 10;//并发为10

    private static ExecutorService threadPool = Executors
            .newFixedThreadPool(THREAD_COUNT);

    private static Semaphore s = new Semaphore(3); //设置最大访问量为3个

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        s.acquire();
               Thread.sleep(3000); System.out.println(
"save data"); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }

从上面代码看出来给它10个线程,但是每次只允许3个并发的执行。

通过上面例子,来分析一下源码

构造函数

Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量,也是默认的非公平性模式

Semaphore(int permits,boolean fair)创建公平性还是非公平性模式

acquire()

acquire()从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。

如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态:

release()
     方法,并且当前线程是下一个要被分配许可的线程;或者
  • 其他某些线程中断当前线程。

 

  • 被此方法将其已中断状态设置为 on ;或者
  • 在等待许可时被中断

InterruptedException,并且清除当前线程的已中断状态。 

抛出:
InterruptedException - 如果当前线程被中断

 Semaphore还提供一些其他方法:

  • int availablePermits() :返回此信号量中当前可用的许可证数。
  • int getQueueLength():返回正在等待获取许可证的线程数。
  • boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
  • void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
  • Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
原文地址:https://www.cnblogs.com/gudulijia/p/6893959.html