JDK1.5 Semaphore实例
编程技术  /  houtizong 发布于 3年前   96
Semaphore类
一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用 acquire() 时无法保持同步锁定,因为这会阻止将项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。
将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,二进制信号量具有某种属性(与很多 Lock 实现不同),即可以由线程释放“锁定”,而不是由所有者(因为信号量没有所有权的概念)。在某些专门的上下文(如死锁恢复)中这会很有用。
构造方法:
a. Semaphore(int permits):用给定的许可数和非公平的公平设置创建一个 Semaphore。
b. Semaphore(int permits, boolean fair):用给定的许可数和给定的公平设置创建一个 Semaphore。
实例:
package com.bijian.thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class Main {/** * @param args */public static void main(String[] args) {// 线程池ExecutorService exec = Executors.newCachedThreadPool();// 只能5个线程同时访问final Semaphore semp = new Semaphore(5);// 模拟20个客户端访问for (int index = 0; index < 20; index++) {final int NO = index;Runnable run = new Runnable() {public void run() {try {// 获取许可semp.acquire();System.out.println(Thread.currentThread().getName() + ": Accessing: " + NO);Thread.sleep((long) (Math.random() * 1000));} catch (InterruptedException e) {e.printStackTrace();} finally {// 访问完后,释放semp.release();System.out.println("-----------------" + semp.availablePermits());}}};exec.execute(run);}// 退出线程池exec.shutdown();}}
运行结果:
pool-1-thread-1: Accessing: 0pool-1-thread-4: Accessing: 3pool-1-thread-3: Accessing: 2pool-1-thread-2: Accessing: 1pool-1-thread-6: Accessing: 5-----------------1pool-1-thread-8: Accessing: 7-----------------1pool-1-thread-7: Accessing: 6-----------------1pool-1-thread-9: Accessing: 8-----------------1pool-1-thread-10: Accessing: 9-----------------1pool-1-thread-5: Accessing: 4-----------------1pool-1-thread-11: Accessing: 10-----------------1pool-1-thread-12: Accessing: 11-----------------1pool-1-thread-13: Accessing: 12-----------------1pool-1-thread-14: Accessing: 13-----------------1pool-1-thread-15: Accessing: 14-----------------1pool-1-thread-16: Accessing: 15-----------------1pool-1-thread-17: Accessing: 16-----------------1pool-1-thread-18: Accessing: 17-----------------1pool-1-thread-19: Accessing: 18-----------------1pool-1-thread-20: Accessing: 19-----------------1-----------------2-----------------3-----------------4-----------------5
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接