`

信号量-控制并发数量

 
阅读更多

 

 Semaphore 信号量,控制并发的数量即 控制同时有几个线程同时执行 。

线程在执行前调用Semaphore 的acquire()方法获取线程执行权限,如果信号量里面有余的令牌,则当前线程可以执行,没有的话就等待

线程执行结束则调用release(),释放当前的令牌,其他线程就可以获取这个令牌,继续执行

获取可以的剩余信号令牌:availablePermits() 

 

直接例子吧:

 

/**
 * 作用:Semaphore 信号量,控制并发的数量即 控制同时有几个线程同时执行
 * 场景:前提:一个商店的工人倒班工作,按照工时给工资
 *      商店同时需要5个人同时工作, 多余的其他工人等到这5个工人需要休息了,就顶上继续工作
 */
public class SemaphoreTest {

	public static void main(String[] args) {
		 Semaphore semaphore = new Semaphore(5); 
		 ExecutorService executor = Executors.newFixedThreadPool(30) ; 
		 
		 for(int i=0;i<10;i++ ){
			 executor.execute(  new SlaveThread4(semaphore,  i));	 
		 }
		 
		 executor.shutdown(); 
	}
}

//工人类
class SlaveThread4  implements Runnable {
	//工人编号
	private Integer number ; 
	//线程开始标识
	private Semaphore semaphore;
 
	
	public SlaveThread4(Semaphore semaphore ,  int number){
		this.number = number ;
		this.semaphore = semaphore ; 
	}
	
	@Override
	public void run() {
		
		try {
			semaphore.acquire(); 
			System.out.println( "工人  "+number+"  开始工作"+new Date());
			work() ; 
			semaphore.release();
			System.out.println( "工人  "+number+"  结束工作  ,  剩余空缺人:"+semaphore.availablePermits());
		} catch (InterruptedException e) {
			e.printStackTrace();
		} 
		
	}
	
	//抬起
	public void work(){
		try {
			//抬起箱子总共花费时间 3s
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

 

分享到:
评论

相关推荐

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

    以下是一个简单的示例,展示了如何在易语言中使用信号量控制线程数量: ```易语言 .信号量 = 创建信号量(5, 5) // 初始化一个信号量,初始值和最大值均为5,表示最多有5个线程并发执行 .线程池 = 创建数组(10, ....

    分布式锁与信号量-2023C-mas开发笔记

    总的来说,分布式锁和信号量是分布式系统中保证数据一致性和控制并发的关键工具。选择哪种机制取决于具体需求,如是否需要严格的互斥访问(分布式锁),还是可以接受一定程度的并发(信号量)。理解这两种机制,并能...

    分布式锁与信号量- docx资源

    信号量通常用于实现资源池或限制并发访问数量,以避免系统过载。 ##### 3.2 应用场景 - **资源池管理**:如数据库连接池、线程池等,信号量可以限制池中资源的最大并发使用量,从而提高资源利用率。 - **限制并发...

    分布式锁与信号量-2023C-m开发笔记

    与分布式锁不同的是,信号量允许一定数量的并发访问,而不仅仅是互斥访问。信号量有两种类型:互斥信号量(互斥访问,仅允许一个进程访问)和计数信号量(允许多个进程访问,但有上限)。在2023C-m开发中,开发者...

    VC多线程编程,利用信号量进行控制

    - 控制并发访问数据库连接、文件或其他I/O资源。 - 并发访问全局变量或数据结构,防止数据不一致。 - 管理线程池中的线程数量,防止过多线程同时运行导致系统资源耗尽。 了解并熟练掌握信号量的使用,有助于编写...

    分布式锁与信号量Web-master-demo

    而对于可并发访问,但需要限制并发数量的情况,信号量则是更好的选择。 在`Heart-First-JavaWeb-master-(13).zip`这个项目中,很可能是通过JavaWeb技术栈实现了分布式锁或信号量的示例。这个项目可能包含了如何在...

    操作系统---------信号量机制

    总结来说,信号量机制是操作系统中实现并发控制的重要手段,它通过控制信号量的增减,有效地解决了多个进程或线程对同一资源的访问冲突,保证了程序的正确性和系统的高效运行。在Linux等操作系统中,信号量通过标准...

    c语言信号量的使用实例

    ### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要...理解和掌握信号量的工作原理以及其实现细节对于开发高质量的并发程序至关重要。

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

    信号量是一个计数器,可以用来控制同时访问特定资源的线程数量。它有两种类型:二进制信号量(Binary Semaphore)和计数信号量(Counting Semaphore)。二进制信号量只有0和1两个状态,通常用于互斥访问,而计数信号...

    19,信号量_rtthread_STM32F103_RTT_信号量_

    本文将深入探讨标题"19,信号量_rtthread_STM32F103_RTT_信号量_"所涉及的关键知识点,包括RT-Thread(RTT)在STM32F103微控制器上的应用,以及信号量的两种主要类型:二值信号量和计数信号量。 首先,RT-Thread是...

    分布式锁和信号量都是在分布式系统中用于控制并发访问的重要工具,它们有不同的特点和应用场景: 1. **分布式锁**:

    - **并发数量限制**:信号量的作用是限制同一时间内能够访问特定资源的客户端数量。这通常用于资源的有限管理,以防止过度消耗系统资源导致系统崩溃。 - **常见实现方式**: - **基于Redis的计数器**:利用Redis的...

    有关水果问题的信号量程序

    这就是信号量在解决并发控制问题上的基本应用。在WindowsFormsApplication1项目中,可能会有一个模拟这个场景的用户界面,通过点击按钮模拟爸爸、妈妈放水果,以及儿子、女儿吃水果的过程,通过后台代码实现上述逻辑...

    linux信号量详解

    信号量的值可以理解为某种资源的数量,通过控制这种资源的分配,信号量实现了进程间的互斥和同步。当信号量的值设为1时,其功能等同于互斥锁,确保资源的独占访问。而当值大于1时,信号量则允许多个线程或进程同时...

    QT 下 信号量使用

    信号量允许我们控制对共享资源的访问,确保同一时间只有一个线程或者有限数量的线程能够访问特定的资源,从而避免了数据竞争和其他并发问题。在QT中,我们可以利用QSemaphore类来实现这一功能。 QSemaphore类提供了...

    Java进程信号量机制的实验程序

    综上所述,Java进程信号量机制是解决多线程环境中资源管理和同步问题的有效工具,通过Semaphore类提供的API,开发者可以灵活地控制并发程度,避免资源过度竞争,保证程序的正确性和效率。在实际项目中,根据需求选择...

    Java并发编程(23)并发新特性-信号量Semaphor

    在实际应用中,如数据库连接池、线程池、分布式系统等场景,信号量都能发挥重要作用,帮助开发者有效地控制并发和同步,避免资源竞争和死锁等问题。 总的来说,Java并发编程中的信号量是一个强大的工具,通过合理地...

    STM32的UCOSII信号量程序,亲测可用

    1. **信号量概念**:信号量是一种计数器,可以是整数值,用于表示某种资源的数量或者状态。它可以用来保护临界区,即一段需要独占访问的代码。 2. **信号量类型**:UCOSII支持两种类型的信号量:二进制信号量和计数...

    ucosIII信号量多值信号量二值信号量互斥信号量

    在uC/OS-III中,信号量被设计成能够有效地管理资源的访问,并通过一系列API函数来控制信号量的行为。信号量的核心思想是维护一个数值,用来表示当前可用资源的数量。当任务需要访问受保护资源时,会尝试减少该数值;...

Global site tag (gtag.js) - Google Analytics