`

Semaphore信号灯实例

阅读更多
package concurrent.lock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
 * 信号灯
 * 只有拿到信号灯的线程才能执行,没拿到信号灯的要等待
 * 
 */
public class SemaphoreTest {
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final Semaphore sp = new Semaphore(3);
		for(int i=0;i<10;i++){
			Runnable runnable = new Runnable(){
					public void run(){
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"进入,当前已有" + (3-sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long)(Math.random()*10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName() + 
							"即将离开");					
					sp.release();
					//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程" + Thread.currentThread().getName() + 
							"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");					
				}
			};
			service.execute(runnable);			
		}
	}

}

分享到:
评论

相关推荐

    CenaFilosofos:使用交通信号灯解决哲学家的晚餐问题

    Java提供了多种同步工具,如synchronized关键字、Semaphore(信号量)等,可以用来模拟交通信号灯的效果。例如,Semaphore可以限制同时访问筷子的数量,从而防止所有哲学家同时拿起筷子造成死锁。 项目的实现通常...

    深刻理解进程间通信

    信号灯(Semaphore)是一种同步原语,用于解决多个进程或线程对共享资源的竞争问题。信号灯分为二进制信号灯和计数信号灯两种。 **4.2 Linux信号灯** Linux支持多种类型的信号灯,包括System V信号灯和POSIX信号灯...

    C#十字路口红绿灯模拟

    10. **拓展性**:考虑项目的未来扩展,比如增加人行横道信号、自适应交通流量的智能控制等功能,设计时应保持代码的模块化和灵活性。 通过以上步骤,我们可以构建出一个功能完备的十字路口红绿灯模拟系统。在实践中...

    Thread_study04:多线程_线程协作_生产者消费者模式,管程法,信号灯法,定时调度,单例模式,Threadlocal,可重入锁,CAS

    在Java中,`java.util.concurrent.Semaphore`类提供了信号灯功能,允许指定数量的线程同时访问特定资源,超过限制则等待。 4. **定时调度**:Java提供了`java.util.Timer`和`java.util.concurrent....

    用JAVA做的红绿灯

    在Java编程语言中,我们可以利用多线程技术来模拟现实世界中的交通信号灯控制系统,即红绿灯。这个程序的设计可以让我们深入理解并发编程的概念,以及如何在Java中实现线程间的协调与通信。 首先,我们需要了解红...

    学习进程间通信的示例代码

    信号量分为互斥量(Mutex)和信号灯(Semaphore),互斥量用于保护临界区,确保同一时刻只有一个进程访问,而信号灯则能控制多个资源的并发访问。 最后,**共享内存**(Shared Memory)是进程间通信最快的方式,...

    Rsemaforos1

    在Rsemaforos1项目中,可能会用到`Semaphore`来模拟信号灯的切换,限制同时通行的线程数量,确保交通流量的控制。 4. **设计模式** 项目可能采用了观察者模式(Observer Pattern),使得信号灯状态的改变能够通知...

    Linux-code.rar_linux进程通信

    信号量有两种类型:互斥量(Mutex)和信号灯(Semaphore),互斥量用于保护临界区,防止资源竞争,而信号灯则可以管理多个资源。 5. **共享内存**:共享内存允许不同进程直接读写同一块内存区域,效率较高。为了...

    unix环境高级编程(精编)

    信号灯(Semaphore)则是控制进程同步和互斥的一种方法,它允许进程等待特定条件满足后再继续执行。 三、文件与I/O操作 UNIX系统中的文件系统是其强大功能的核心之一。书中讲解了文件的打开、关闭、读写操作,以及...

    清华大学vxworks实验应用程序开发

    在VxWorks中,应用程序通常由任务(Task)、中断服务程序(ISR)、信号量(Semaphore)、消息队列(Message Queue)、信号灯(Mutex)等核心组件构成。通过这些组件,开发者可以构建出高效并发运行的系统。 实验...

    demo.rar_进程与线程_C/C++_

    **信号灯(Semaphore)**:信号灯是一种更复杂的同步工具,可以控制多个线程对资源的访问数量。它有一个整数值,线程每次获取资源时会尝试减一,如果值为0,则线程会被阻塞;当有线程释放资源时,信号量的值会加一,...

    线程同步的一个小程序

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

    信号

    例如,`AutoResetEvent`可以作为一个信号灯,当事件发生时,它会允许一个等待的线程继续执行,然后自动重置,阻止其他线程。这种方式常用于实现生产者-消费者模式或其他同步场景。 标签"C#"表明我们关注的是C#语言...

    Real-Time Concepts for Embedded Systems

    RTOS通常包括一些基本的内核对象,如任务(Task)、信号灯(Semaphore)、消息队列(Message Queue)等。任务是RTOS中最小的可调度单位,负责执行特定的代码序列。信号灯常用来进行任务之间的同步,而消息队列则用于...

    如何用PV原语实现进程间的互斥与同步

    #### 应用实例分析 为了更深入地理解PV原语的工作原理及其在实际应用中的作用,下面将通过几个具体的案例来探讨PV原语是如何帮助实现进程间的互斥与同步的。 ##### 例1:两个进程共享一个资源 假设存在两个进程A...

    陈向群编著《操作系统》第三章部分作业参考答案

    #### 1.13 信号量(Semaphore)使用示例 在操作系统中,信号量是一种常用的进程同步机制,用于解决进程间的互斥问题。例如,代码片段中通过信号量`mutex`控制对共享变量`N`的访问,确保任何时候只有一个进程能够...

    操作系统课程设计

    在操作系统中,这通常通过信号量(Semaphore)或者互斥锁(Mutex)来实现。我们可以为每个方向设置一个信号量,初始值为0,表示红灯。当绿灯亮起,信号量加1,表示车辆可以通行;红灯亮起时,信号量减1,表示车辆需...

    delphi多线程机制剖析及其应用

    - **信号灯(Semaphore)**:用于控制对有限资源的访问,允许指定数量的线程同时访问资源。 #### 实例演示 为了进一步说明Delphi中多线程技术的实际应用,我们可以通过一个简单的示例来演示如何创建和管理线程。...

    Android多线程全新讲解.pdf

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

    Go并发编程技术讲解

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

Global site tag (gtag.js) - Google Analytics