您的位置:首页 > 编程语言 > Java开发

JAVA Semaphore

2014-04-06 19:52 253 查看
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(): 创建一个线程池,这个与本文没有什么关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: