信號量使用案例

 

信號量使用案例:

 

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class MySemaphore extends Thread {
Semaphore position;
private int id;
public MySemaphore(int i,Semaphore s){
    this.id=i;
    this.position=s;
}

public void run(){
    try{
    	if(position.getQueueLength()>30){
    		//如果拍排隊人數超過30人     	
    		System.out.println("顧客["+this.id+"],由於排隊人數"+position.getQueueLength()+"太長,請換個廁所");
    		return;
    	}
     if(position.availablePermits()>0){
      System.out.println("顧客["+this.id+"]進入廁所,有空位");
     }
     else{
      System.out.println("顧客["+this.id+"]進入廁所,沒空位,排隊");
     }     
     position.acquire();
     System.out.println("顧客["+this.id+"]獲得坑位");
     Thread.sleep((int)(Math.random()*1000));
     System.out.println("顧客["+this.id+"]使用完畢");
     position.release();
    }
    catch(Exception e){
     e.printStackTrace();
    }
}
public static void main(String args[]){
  ExecutorService list=Executors.newCachedThreadPool();
    Semaphore position=new Semaphore(5);//信號量是5,時間片內最多隻有5個顧客上廁所
    for(int i=0;i<100;i++){
     list.submit(new MySemaphore(i+1,position));
    }
    list.shutdown();
    position.acquireUninterruptibly(2);
    System.out.println("使用完畢,需要清掃了");
    position.release(2);
}
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章