java并发工具包:Semaphore的用法

来源:互联网 发布:淘宝详情页尺寸790 编辑:程序博客网 时间:2024/06/06 22:36

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;}@Overridepublic 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用户已经完成交易...



1 0