semaphore['seməfɔ:(r)] 是信号的意思。

  在JAVA里面,我的理解是信号计数的作用,比如我想设置只能允许500个线程访问WebServer,那么如何控制500个数量哪?每来一个请求,就通过acquire()获取一个许可,然后数量自动减一,处理完成之后通过release()释放一个许可,数量自动加一。这样就实现了控制的作用,当然这个功能咱们自己通过锁的机制可以自己完成,不过使用Semaphore比较简单、方便,这也是它产生的原因。好了废话少说,写一段代码看看。

Test.java

package com.taobao;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;
/**
 * Semaphore 信号量测试代码
 * @author liqiu
 *
 */
public class Test implements Runnable {
    // 只能5个线程同时访问
    Semaphore semp = new Semaphore(5);
    int num = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            // 获取许可
            semp.acquire();
            System.out.println("这是第几个线程:" + this.num++);
            //System.out.println(this.num);
            Thread.sleep((long) (Math.random() * 10000));
            // 访问完后,释放
            semp.release();
            System.out.println("空闲线程的数量:" + semp.availablePermits());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
    }
    
    public static void main(String[] args) {
        // 线程池
        ExecutorService exec = Executors.newCachedThreadPool();
        Test test = new Test();
        // 模拟20个客户端访问
        for (int index = 0; index < 10; index++) {
            System.out.println("开启了第几个线程:"+index);
            exec.execute(test);
        }
        // 退出线程池
        exec.shutdown();

    }
}

执行的结果:

开启了第几个线程:0
开启了第几个线程:1
这是第几个线程:0
开启了第几个线程:2
这是第几个线程:1
开启了第几个线程:3
这是第几个线程:2
开启了第几个线程:4
这是第几个线程:3
开启了第几个线程:5
这是第几个线程:4
开启了第几个线程:6
开启了第几个线程:7
开启了第几个线程:8
开启了第几个线程:9
空闲线程的数量:1
这是第几个线程:5
空闲线程的数量:1
这是第几个线程:6
空闲线程的数量:1
这是第几个线程:7
空闲线程的数量:1
这是第几个线程:8
空闲线程的数量:1
这是第几个线程:9
空闲线程的数量:1
空闲线程的数量:2
空闲线程的数量:3
空闲线程的数量:4
空闲线程的数量:5

  解释一下上面用到的几个函数:

  availablePermits(): 返回空闲线程的数量

  acquire(): 申请线程

  release(): 释放线程

  Executors.newCachedThreadPool(): 创建一个线程池,这个与本文没有什么关系