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(): 创建一个线程池,这个与本文没有什么关系