JAVA Semaphore
2014-04-06 19:52
253 查看
semaphore['seməfɔ:(r)] 是信号的意思。
在JAVA里面,我的理解是信号计数的作用,比如我想设置只能允许500个线程访问WebServer,那么如何控制500个数量哪?每来一个请求,就通过acquire()获取一个许可,然后数量自动减一,处理完成之后通过release()释放一个许可,数量自动加一。这样就实现了控制的作用,当然这个功能咱们自己通过锁的机制可以自己完成,不过使用Semaphore比较简单、方便,这也是它产生的原因。好了废话少说,写一段代码看看。
Test.java
执行的结果:
解释一下上面用到的几个函数:
availablePermits(): 返回空闲线程的数量
acquire(): 申请线程
release(): 释放线程
Executors.newCachedThreadPool(): 创建一个线程池,这个与本文没有什么关系
在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(): 创建一个线程池,这个与本文没有什么关系
相关文章推荐
- Java并发之Semaphore详解
- JAVA多线程之——Semaphore
- Java之 Semaphore信号量的原理和示例
- java多线程控制-信号量Semaphore
- Java并发之Semaphore的学习
- Java并发学习(十五)-并发工具Semaphore
- 【死磕Java并发】—– J.U.C之并发工具类:Semaphore
- JAVA多线程--信号量(Semaphore)
- Java 并发专题 : Semaphore 实现 互斥 与 连接池
- 多线程 : Java 信号量 Semaphore 使用
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger
- [Java并发包学习六]Semaphore介绍
- java 并发编程 CountDownLatch、CyclicBarrier和 Semaphore
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(6)
- Java并发-类库新组件 - Semaphore 理解:计数信号量
- Java各种Synchronizer: CountDownLatch, CyclicBarrier,Semaphore
- java Semaphore使用详解
- Java之Semaphore
- (转)java并发之CountDownLatch、Semaphore和CyclicBarrier
- Java Semaphore 生产者消费者线程同步