Semaphore的作用说白了就是限制目标资源在原子操作中允许的线程数量。直接上例子:
package test;
import java.util.concurrent.Semaphore;
/**
* @author 作者 peng.tu
* @version 创建时间:2015年9月8日
*/
public class MyTest {
/**
* 模仿用户去银行取钱的业务,假设同时有6个用户来银行取钱,而银行只有2台取款机(最多只有两个人在取钱)
*
* new Semaphore(Integer num); 中num的值默认是1,当指定具体的值时,则说明同时最多只允许num的线程请求资源
*
* @param args
*/
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(2);//假设有两个窗口提供服务
new Thread(new Person(semaphore, "A")).start();
new Thread(new Person(semaphore, "B")).start();
new Thread(new Person(semaphore, "C")).start();
new Thread(new Person(semaphore, "D")).start();
new Thread(new Person(semaphore, "E")).start();
new Thread(new Person(semaphore, "F")).start();
}
}
class Person implements Runnable {
private Semaphore semaphore;
private String name;
public Person(Semaphore semaphore, String name) {
this.semaphore = semaphore;
this.name = name;
}
@Override
public void run() {
System.out.println(name + "用户正在排队...");
try {
semaphore.acquire();//锁住资源
System.out.println(name + "用户正在取钱...");
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "用户已经完成交易...");
semaphore.release();//取款完成,释放资源
}
}
运行结果可以看出,用户一直都是只有两个人在取钱,而其他用户则是处在排队状态:
B用户正在排队...
A用户正在排队...
A用户正在取钱...
B用户正在取钱...
C用户正在排队...
E用户正在排队...
D用户正在排队...
F用户正在排队...
A用户已经完成交易...
B用户已经完成交易...
C用户正在取钱...
E用户正在取钱...
E用户已经完成交易...
C用户已经完成交易...
D用户正在取钱...
F用户正在取钱...
D用户已经完成交易...
F用户已经完成交易...