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];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客