`

通过semaphore信号灯,开启多个线程,但只并发3个线程

 
阅读更多

 

package com.mhm.test1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;


/**
 * semaphore 信号灯
 * 20个线程,开启3个信号灯,一个线程拿走一个灯,也就是说,同时只能有3个线程并发
 * 一盏灯类似互斥sync
 * @author Administrator
 *
 */
public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService es = Executors.newCachedThreadPool();
		
		final Semaphore sp = new Semaphore(3);
		
		for (int i = 0; i < 20; i++) {
			Runnable r = new Runnable() {
				@Override
				public void run() {
					try {
						sp.acquire();
						System.out.println("进入" + Thread.currentThread().getName() + " 当前有" + (3 - sp.availablePermits()) + "线程并行");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					try {
						Thread.sleep((long)Math.random() * 10000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					System.out.println("【即将离开】" + Thread.currentThread().getName() + " 当前有" + (3 - sp.availablePermits()) + "线程并行");
					
					sp.release();
					
					System.out.println("【离开】" + Thread.currentThread().getName() + " 当前有" + (3 - sp.availablePermits()) + "线程并行");
				}
			};
			
			es.execute(r);
		}
		
		es.shutdown();
	}
}

 

 

分享到:
评论

相关推荐

    Linux多线程环境信号灯的使用

    在多线程环境中,信号灯(Semaphore)是一种同步机制,用于控制多个线程对共享资源的访问,避免竞态条件的发生。本文将深入探讨在Linux Red Hat 7.0环境下如何使用信号灯,并以提供的`test.c`源代码为例进行解析。 ...

    信号灯模型线程实现方法

    在系统级芯片(System-on-a-Chip, SOC)上实现信号灯模型,可以有效地协调多个任务或线程,确保资源的安全访问和避免竞态条件。在本案例中,我们将详细探讨如何通过`Method`方法在SOC上实现这一模型。 首先,我们...

    信号灯法实现生产者与消费者模式.rar

    "信号灯法"(也称为信号量或Semaphore)是一种有效的方法,用于解决生产者与消费者问题,这种模式在并发编程中非常常见。下面我们将深入探讨这个主题。 **生产者与消费者模式** 是一个经典的多线程问题,涉及到两个...

    java线程并发semaphore类示例

    Semaphore,顾名思义,就像是一个信号灯或通行证,用来管理一组有限的资源。在Java中,Semaphore类提供了对并发线程进行计数的许可管理,允许我们限制同时访问特定资源的线程数量。这在处理并发任务时非常有用,例如...

    多线程控制红绿灯变化

    在本场景中,“多线程控制红绿灯变化”是一个典型的并发编程问题,旨在模拟现实生活中交通信号灯的交替工作模式。这个系统设计通常涉及两个主要线程,一个负责控制红灯,另一个负责控制绿灯,它们需要按照特定的时间...

    Linux环境下多线程编程及信号灯同步互斥应用指南

    此外,还探讨了如何使用 semaphore 实现进程间的同步与互斥,通过实例解析展示了经典的多线程和进程间通讯问题,如生产者消费者模型、信号灯的应用场景及解决办法。 适合人群:对于有一定Linux系统操作基础的学生...

    Linux信号灯C语言编程示例(包含信号灯回滚,信号等取值和初始化操作)

    在Linux系统编程中,信号灯(Semaphore)是一种用于进程间通信的重要同步机制,它允许多个进程协调对共享资源的访问。本示例着重讲解如何使用C语言实现信号灯,包括信号灯的初始化、信号灯回滚、信号等待和信号释放...

    Windows驱动编程视频教程-用户模式的事件与信号灯

    1. **线程同步**:在驱动程序中,当多个线程可能同时访问同一资源时,事件和信号灯可以确保线程安全地访问,避免数据竞争和死锁。 2. **设备访问控制**:驱动程序可能需要控制对硬件设备的访问,以防止并发操作导致...

    Posix多线程编程学习笔记

    Posix多线程编程涉及到了线程的基础概念、线程的创建、信号灯、互斥量以及共享内存等多个方面。掌握这些基础知识对于开发高性能、可靠的多线程应用至关重要。通过合理的使用这些工具和技术,开发者可以有效地避免...

    多线程、许可证、互斥量、信号量 API的使用

    许可证,也称为信号灯或信号量,是多线程同步的一种机制,用于限制对共享资源的并发访问。它是一个整数值,当值为正时,表示可用许可证的数量;当值为零时,其他试图获取许可证的线程将被阻塞,直到有线程释放许可证...

    线程同步的一个小程序

    8. **Semaphore**:信号灯,可以控制同时访问特定资源的线程数量,与互斥量类似,但更灵活,可以控制多个线程同时访问。 在实际编程中,选择哪种同步机制取决于具体的需求。例如,如果需要确保某个资源只被一个线程...

    操作系统课设报告.docx

    互斥信号灯用于实现上锁操作,防止多个线程同时访问同一个资源。信号量用于实现同步操作,确保线程之间的执行顺序。 知识点3:多线程解决读者阅览问题 读者阅览问题是操作系统中的一种经典问题,指的是多个读者...

    多线程线程

    标题中的“多线程线程”意味着我们要探讨的是计算机编程中的并发执行机制,特别是与操作系统和编程语言相关的多线程概念。多线程允许一个应用程序同时执行多个任务,提高资源利用率,改善性能,并实现复杂的同步和...

    linux多线程信号量.pdf

    在Dijkstra的模型中,信号如同铁路信号灯,控制着单线轨道上的火车通行。在计算机术语中,信号量是一个简单的整数值,线程通过P(prolagen,尝试减少)和V(verhogen,增加)操作来管理信号量,以确保对共享资源的...

    uc/os-iii在stm32上面多线程的demo

    - **LED控制**:可能创建了多个线程,分别负责不同LED灯的闪烁,通过信号量或互斥锁协调,避免同时改变同一LED的状态。 - **任务创建**:使用`OSTaskCreate()`函数创建线程,指定入口函数、栈大小和优先级。 - **...

    Android多线程全新讲解.pdf

    `Semaphore`可以作为信号灯,控制对共享资源的访问数量。`CyclicBarrier`是一个同步点,允许多个线程等待彼此到达后再一起继续执行。`CountDownLatch`可以让一个线程等待其他线程完成操作,而`Exchanger`则允许两个...

    VC随笔线程同步[借鉴].pdf

    《VC随笔线程同步》探讨的是在Microsoft Visual C++(VC++)环境下,如何通过线程同步技术确保多线程程序的正确性和高效性。线程同步是为了解决多个线程之间协作的问题,尤其是避免对共享资源的冲突访问。在多线程编程...

    Go并发编程技术讲解

    在多进程编程中,Go语言支持传统的进程间通信(IPC)机制,如管道(Pipe)、信号(Signal)、消息队列(MessageQueue)、信号灯(Semaphore)和套接字(Socket)。而多线程编程中,Go语言使用共享内存区...

    thread通訊說明文件

    2. 信号灯(Semaphore):允许多个线程同时访问,但有一个上限。可以用于控制资源的最大并发访问数量。 3. 事件(Event):提供一种线程间通信的方式,线程可以等待特定事件发生后再继续执行。 这些同步工具在多...

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

    在多线程控制中,信号量是一个关键的概念,用于协调多个线程对共享资源的访问,从而避免了竞态条件和死锁等问题。本文将深入探讨易语言中的信号量控制线程数量这一主题。 首先,我们需要理解什么是线程。线程是程序...

Global site tag (gtag.js) - Google Analytics