マルチスレッドのSemaphore(信号量)応用


(1)業務上の需要:20人が切符を買いに行くが、窓口は二つしかない.二人の中の一人が買った後、残りの18人の一人は引き続き購入することができる.
Semaphore(信号量):現在同時にアクセスするための数、同時アクセス量の制御
                                    
package com.guoanjia.common.utils;

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

/**
 * @author syliu
 * @Title:
 * @Package SemaphoreDemo
 * @create 2018/5/14 0014
 */
public class SemaphoreDemo {
   /**
    *  
    */
   class SemaphoreRunnable implements Runnable {
      // 
      private Semaphore semaphore;
      // 
      private int usernum;

      public SemaphoreRunnable(Semaphore semaphore, int usernum) {
         this.semaphore = semaphore;
         this.usernum = usernum;
      }

      @Override
      public void run() {
         try {
            // , 
            semaphore.acquire();
            PrintLogger.info(" 【" + usernum + "】 ");
            Thread.sleep((long) (Math.random() * 10000));
            PrintLogger.info(" 【" + usernum + "】 , ");
            // , 
            semaphore.release();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }

   public void execute() {
      final Semaphore semaphore = new Semaphore(2);
      // 
      final ExecutorService executorService = Executors.newCachedThreadPool();
      for (int i = 1; i < 21; i++) {
         executorService.execute(new SemaphoreRunnable(semaphore, i));
      }
      // 
      executorService.shutdown();
   }

   public static void main(String[] args) {
      final SemaphoreDemo semaphoreDemo = new SemaphoreDemo();
      semaphoreDemo.execute();
   }
}

適用シーン:ストリーム制限または同時スレッド数の制御