zoukankan      html  css  js  c++  java
  • Java多线程——Semaphore信号灯

    Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允许的并发访问数。

    Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。

    另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。

    单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

    package java_thread;
    
    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);			
    		}
    	}
    
    }
    
  • 相关阅读:
    傅里叶变换相关公式
    Java中的IO流
    oracle sqlplus 命令行中创建存储过程
    Redis 缓存数据库的使用场景
    Java 数值格式化类-NumberFormat
    Idea_类注释、属性注释、方法注释
    博客·HelloWorld
    【4】Django 创建第一个模块应用
    【3】Django创建第一个项目
    理解面向对象三大特征与魔法方法?
  • 原文地址:https://www.cnblogs.com/tonglin0325/p/6264634.html
Copyright © 2011-2022 走看看