JAVA Semaphore実現信号灯

1572 ワード

lSemaphoreは、現在アクセスしているスレッドの数を維持し、同期メカニズムを提供します.Semaphoreを使用すると、リソースに同時にアクセスするスレッドの数を制御できます.たとえば、ファイルが許可する同時アクセス数を実現します.
ØSemaphoreが実現した機能はトイレのように5つの穴があり、もし10人がトイレに行くなら、同時に何人がトイレに行くことができますか?同時に5人しか占有できないが、5人のいずれかが譲った後、待機していた他の5人のうち1人が占有できるようになった.
Øさらに待機している5人の中では、Semaphoreオブジェクトを構築する際に入力されるパラメータオプションに応じて、ランダムに優先順位を獲得してもよいし、先着順に機会を獲得してもよい.
l単一信号量のSemaphoreオブジェクトは、反発ロックの機能を実現することができ、一方のスレッドによって「ロック」が得られ、他方のスレッドによって「ロック」が解放され、デッドロック回復の場合に適用することができる.
駐車スペースの管理、小さな電子機器、リアルタイム性が強い
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);			
		}
	}

}