`
raymond.chen
  • 浏览: 1436881 次
  • 性别: 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");
	}	
}

 

分享到:
评论

相关推荐

    使用信号量(Semaphore)实现线程的同步

    信号量有两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量的值只能为0或1,相当于一个互斥锁,确保同一时间只有一个线程能访问资源。计数信号量的值可以为任何非负整数...

    信号量Semaphore了解过吗?

    信号量Semaphore,这是一个在多线程编程中至关重要的同步机制,尤其在操作系统设计和并发编程领域,它扮演着协调多个线程对共享资源访问的角色。面试中被问及但回答不出,可能会显示出对并发控制理解的不足,因此,...

    QT 下 信号量使用

    计数信号量可以有任意非负的初始值,而二进制信号量则等同于一个简单的互斥锁,其初始值为1,意味着同一时间只能有一个线程访问。 **1. QSemaphore的构造与基本操作** QSemaphore可以通过指定初始计数值来创建,...

    c++多线程同步——信号量

    它有两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有0和1两个状态,通常用于互斥访问,而计数信号量可以有任意非负整数值,可以允许多个线程同时访问资源,但不...

    semaphore控制多线程循序执行

    Semaphore是一种计数信号量,它可以有正整数值,用于管理多个线程对公共资源的访问。当信号量的值为正时,线程可以获取一个许可(或称资源),然后继续执行;当值为零时,线程会被阻塞,直到其他线程释放一个许可。...

    信号量同步等待机制 semaphore wait-and-signal

    - **计数信号量**:可以取任意非负整数值,用于解决生产者-消费者问题等场景。 #### 四、信号量操作 信号量的核心操作包括`wait`和`signal`: - **wait操作**:也称为`down`或`P`操作,用于获取信号量的锁。如果...

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

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

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

    Java并发编程Semaphore计数信号量详解 Java并发编程中,Semaphore(信号量)是一种高效的同步机制,允许一定数量的线程访问某个资源。在本文中,我们将详细介绍Java并发编程Semaphore计数信号量的工作原理和应用。 ...

    Minix中实现信号量

    在Minix中,信号量分为两种类型:二进制信号量和计数信号量。二进制信号量只有两个状态,0表示资源不可用,1表示资源可用;计数信号量则可以有任意非负整数值,表示资源的数量。 sema.patch 文件可能包含了对Minix...

    rt-thread信号量_holecev_RT-Thread_rtthread信号量_信号量_

    - **计数信号量**:计数值可以在0到某个最大值之间变化。它允许一定数量的线程同时访问资源,超过限制时,其他线程会被挂起。 在提供的压缩包文件中,我们看到了一些关键文件: - **rtconfig.h**:这是RT-Thread的...

    ucos 信号量

    在UCOSIII中,信号量分为两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有两种状态,要么被占用(0),要么空闲(1);计数信号量则可以有任意非负整数值,表示...

    java并发之Semaphore信号量.md

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

    使用信号量进行多任务同步

    2. **计数信号量**:计数信号量则可以有更大的取值范围,表示可使用的资源数量。当资源被占用时,信号量值减一,如果减后值仍大于0,则其他任务还可以继续获取资源;若减后值为0,则后续请求任务会被挂起,等待信号...

    UCOSII实验2-信号量和邮箱_STM32ucos_

    2. **计数信号量:**在某些场景下,如多线程共享一个资源池时,计数信号量更加适用。每个任务获得信号量意味着可以使用一个资源,当任务完成操作后,需要归还信号量以释放资源。 **邮箱(Mailbox)** 邮箱是UCOSII...

    CSemaphore信号量使用实例

    // 使用后释放,增加信号量计数值 } else { // 处理等待超时或错误的情况 } ``` `WaitForSingleObject()`函数的第一个参数是我们要等待的信号量对象,第二个参数表示等待的超时时间,`INFINITE`表示无限制等待。...

    使用信号量实现线程同步

    信号量(Semaphore)是实现线程同步的一种有效工具,它源于早期的计算机操作系统理论,由荷兰计算机科学家Dijkstra提出。在Windows系统中,信号量作为内核对象被广泛使用,可以用来控制对共享资源的访问。 信号量的...

    信号量YUV.zip_信号量处理

    信号量分为两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有两个状态,0表示不可用,1表示可用,常用于互斥访问。计数信号量可以有任意非负值,用于管理多个资源...

    易语言多线程控制:信号量控制线程数量

    信号量(Semaphore)是一种经典的同步机制,用于控制对共享资源的访问。在易语言中,我们可以利用其提供的信号量API来实现线程间的同步与互斥。信号量值可以用来表示资源的可用数量,当线程试图获取一个资源时,如果...

    VC线程信号量的使用举例

    在VC++环境中,我们通常使用Windows API来管理线程的同步和通信,其中信号量(Semaphore)就是一种常用工具。本文将通过一个简单的VC线程信号量使用例子来介绍其工作原理和应用。 信号量是一种同步机制,用于控制对...

    MFC关于信号量的例子

    在IT行业中,多线程编程是提升程序性能和并发处理能力的重要手段,而信号量(Semaphore)则是多线程同步中的关键概念。本篇将详细探讨MFC(Microsoft Foundation Classes)框架下如何利用信号量来实现线程间的同步与...

Global site tag (gtag.js) - Google Analytics