`
Luob.
  • 浏览: 1589915 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 信号灯 Semaphore

    博客分类:
  • Java
阅读更多
更多介绍http://blog.csdn.net/java2000_wl/article/details/23556859

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

/**
 * 信号灯  控制并发访问数量  
 * 只有 获取运行令牌(信号灯)后 ,才可以运行,当令牌(信号灯)使用完了,后面的访问 只能等着.直到有令牌被释放后,获取令牌才可以继续访问
 */
public class SemaphoreTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ExecutorService service=Executors.newCachedThreadPool();
		final Semaphore sp=new Semaphore(3,true);  //先进来的先执行
		
		for (int i = 0; i < 10; i++) {
			
			Runnable runnable=new Runnable() {
				
				@Override
				public void run() {
					try {
						sp.acquire();//获取通行证
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} 
					System.out.println("线程"+Thread.currentThread().getName()+"进入,当前已有"+(3-sp.availablePermits())+"个并发");
					
					try {
						//System.out.println(new Random().nextLong());
						Thread.sleep(1000);
					} catch (Exception e) {
						// TODO: handle exception
					}
					System.out.println("线程"+Thread.currentThread().getName()+"即将离开");
					sp.release();
					System.out.println("线程"+Thread.currentThread().getName()+"已离开,当前已有"+(3-sp.availablePermits())+"个并发");
				}
			};
			service.execute(runnable);
		}
		
	}

}

实用场景:
Semaphore 分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。
     以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。


下面是模拟一个连接池,控制同一时间最多只能有50个线程访问。
import java.util.UUID;  
import java.util.concurrent.Semaphore;  
import java.util.concurrent.TimeUnit;  
  
public class TestSemaphore extends Thread {  
    public static void main(String[] args) {  
        int i = 0;  
        while (i < 500) {  
            i++;  
            new TestSemaphore().start();  
            try {  
                Thread.sleep(1);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    /** 
     * 控制某资源同时被访问的个数的类 控制同一时间最后只能有50个访问 
     */  
    static Semaphore semaphore = new Semaphore(50);  
    static int timeout = 500;  
  
    public void run() {  
        try {  
            Object connec = getConnection();  
            System.out.println("获得一个连接" + connec);  
            Thread.sleep(300);  
            releaseConnection(connec);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
  
    public void releaseConnection(Object connec) {  
        /* 释放许可 */  
        semaphore.release();  
        System.out.println("释放一个连接" + connec);  
    }  
  
    public Object getConnection() {  
        try {/* 获取许可 */  
            boolean getAccquire = semaphore.tryAcquire(timeout, TimeUnit.MILLISECONDS);  
            if (getAccquire) {  
                return UUID.randomUUID().toString();  
            }  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        throw new IllegalArgumentException("timeout");  
    }  
} 





分享到:
评论

相关推荐

    信号灯模型线程实现方法

    信号灯(Semaphore)是一种同步原语,由两个基本操作组成:`P(Wait)`和`V(Signal)`。`P`操作(尝试获取资源)会检查信号灯的计数值,如果为正,则减一并允许执行;若为零,则线程将被阻塞,等待其他线程释放资源...

    java线程并发semaphore类示例

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

    使用Java模拟交通信号灯.zip

    为了确保信号灯状态的正确切换,开发者可能会使用`synchronized`关键字、`wait()`和`notify()`方法,或者使用`java.util.concurrent`包中的高级并发工具,如`Semaphore`或`CyclicBarrier`。这些工具可以帮助避免竞态...

    用JAVA做的红绿灯

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

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

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

    求和、行李、红绿灯问题java代码

    假设我们需要模拟交通信号灯,我们可以创建一个Runnable任务代表每个灯的状态,并使用synchronized确保同一时间只有一个灯亮: ```java class TrafficLight { private int state; // 红绿灯状态:0-红,1-黄,2-绿...

    Java进阶教程,面试大全

    Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何...

    Java进阶教程,面试大全,包罗万象

    Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何...

    用Java编程模拟实现城市交通控制系统.pdf

    【交通信号灯设计与控制】采用多线程技术,模拟真实世界中东西方向和南北方向交通灯的交替运行。在Java中,可以利用Thread类或Runnable接口创建并发执行的任务,实现交通灯的定时切换。同时,为了确保交通灯状态的...

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

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

    Intelligent_Semaphore_System:代理系统调节城市交通。 使用 Jade、Sumo 和 TrasMAPI

    智能信号灯系统是一种利用先进的信息技术优化城市交通流量的解决方案。在这个项目中,"Intelligent_Semaphore_System"采用了一个代理系统来实现这一目标,它整合了Jade、SUMO(Simulation of Urban MObility)和...

    操作系统课程设计

    每个方向的车辆需等待信号灯变绿才能通行,而信号灯的切换需要遵循一定的规则,确保交通安全。这个问题可以通过信号量来解决,设置不同的信号量代表不同方向的车辆和交通灯状态,通过P(获取信号量)和V(释放信号量...

    JavaConcurrency:Java并发教程

    Semaphore用于控制对共享资源的访问权限,类似于信号灯。 最后,Java并发编程还需要关注线程池的概念。Executor框架提供了灵活的线程管理和任务调度,通过ThreadPoolExecutor可以创建线程池,有效地管理和复用线程...

    多线程控制红绿灯变化

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

    Rsemaforos1

    【Rsemaforos1】项目是一个基于Java编程语言实现的交通信号灯模拟系统。这个系统主要用于演示并发控制和多线程概念,是学习Java并发编程的一个实例。在实际的交通管理中,信号灯系统需要精确地控制不同方向的交通流...

    常用的两个jar包

    `CyclicBarrier`用于让一组线程等待彼此到达一个共同的屏障点,而`Semaphore`则用于控制对共享资源的访问权限,类似于信号灯机制。 `connector.jar`通常与应用服务器,如Tomcat、JBoss等关联,它是Java EE环境中...

    线程同步的一个小程序

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

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

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

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    4. **信号灯机制**:Java中没有直接的“信号灯”概念,但可以通过`Semaphore`类实现类似的信号量控制。 5. **实现所有线程等待某个事件**:可以使用`CountDownLatch`或`CyclicBarrier`等类来同步线程。 6. **CAS及其...

Global site tag (gtag.js) - Google Analytics