`
raymond.chen
  • 浏览: 1418012 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

计数信号量 Semaphore 的使用

 
阅读更多

Semaphore类是一个计数信号量,必须由获取它的线程释放。通常用于控制同时访问特定资源的线程数目。

 

可以将Semaphore理解成一个停车场,里面有指定数量的停车位。acquire就是申请占用一个停车位,release就是释放一个停车位。

 

package com.seasy.test;

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreTest {
	private static Semaphore semaphore;
	private static Random rnd = new Random();
	
	public static void main(String[] args) {
		semaphore = new Semaphore(3); //初始化许可证数量
		System.out.println(semaphore.availablePermits()); //当前可用的许可证数量
		//System.out.println(semaphore.drainPermits()); //获得并返回剩余所有可用的许可证
		System.out.println(semaphore.getQueueLength()); //获取当前Semaphore对象上正在等待许可证的线程数量
		System.out.println(semaphore.hasQueuedThreads()); //判断当前Semaphore对象上是否存在正在等待许可证的线程
		System.out.println(semaphore.isFair()); //是否公平模式FIFO
		
		for(int i=0; i<10; i++){
			Thread thread = new Thread(new Runnable() {
				@Override
				public void run() {
					try{
						//boolean b = semaphore.acquire(); //阻塞式获取一个许可,线程可中断
						//semaphore.acquireUninterruptibly(); //阻塞式获取一个许可,线程不可中断
						boolean b = semaphore.tryAcquire(); //非阻塞式获取一个许可
						
						if(b){
							int value = rnd.nextInt(2000);
							if(value < 100){
								value = 100;
							}
							System.out.println(Thread.currentThread().getName() + ": " + value);
							
							TimeUnit.MILLISECONDS.sleep(value);
							
							semaphore.release(); //释放一个许可
							System.out.println(Thread.currentThread().getName() + " ok");
						}
						
					}catch(Exception ex){
						ex.printStackTrace();
					}
				}
			});
			
			thread.start();
		}
		
		System.out.println("ok");
	}	
}

 

分享到:
评论

相关推荐

    async-semaphore:基于Java并发信号量的计数信号量

    基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...

    java并发之Semaphore信号量.md

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...

    Java并发编程Semaphore计数信号量详解

    主要介绍了Java并发编程Semaphore计数信号量详解,具有一定参考价值,需要的朋友可以了解下。

    rust-semaphore:原子计数信号量

    信号原子计数信号量,可以帮助您控制并发系统中多个进程对公共资源的访问。特征有效的无锁*语义提供RAII风格的获取/发布API 实现Send , Sync和Clone *不使用shutdown API时无锁定

    bt-semaphore:受SBCL信号量启发的波尔多线程的简单信号量类

    从0.8.6版本开始,bordeaux-threads有其自己的内置信号量,因此您绝对应该使用它代替bt-semaphore。 安装 bt-semaphore可通过。 如果您好奇,还可以克隆Git存储库: cd ~/quicklisp/local-projects git clone ...

    深入了解c# 信号量和互斥体

    当在一个信号量上等待的线程解除堵塞时,内核自动会将信号量的计数减1。在.net 下通过Semaphore类来实现信号量同步。 Semaphore类限制可同时访问某一资源或资源池的线程数。WaitOne method, which is inherited from...

    04_FreeRTOS_Counting_Semaphore.rar

    使用CMSIS API ,介绍FreeRTOS中计数信号量 b. 不使用CMSIS API,直接使用FreeRTOS函数 1. 简介 计数信号量可用于控制对资源的访问。要获得对资源的控制,任务必须首先获得信号量。因此减少了信号量计数值。当计...

    03_FreeRTOS_Bin_Semaphore.rar

    信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量: ...- 计数信号量 - 互斥信号量 - 递归信号量 本文介绍: 二进制信号量的使用方法

    线程暂停(循环计数暂停)

    黑窗口 多线程 不断输出数据 按键盘暂停继续,很实用。VC6.0.对于初学信号量的人来说很有用。

    PV操作 文档

    信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。 在 Linux 下,PV 操作...

    java核心知识点整理.pdf

    引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................

    JAVA核心知识点整理(有效)

    引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................

Global site tag (gtag.js) - Google Analytics