多執行緒之Semaphore登入限流示例
阿新 • • 發佈:2021-11-11
public static void main(String[] args) { //允許最大的登入數 int slots=10; ExecutorService executorService = Executors.newFixedThreadPool(slots); LoginQueueUsingSemaphore loginQueue = new LoginQueueUsingSemaphore(slots); //執行緒池模擬登入 for (int i = 1; i <= slots; i++) { finalint num=i; executorService.execute(()->{ if (loginQueue.tryLogin()){ System.out.println("使用者:"+num+"登入成功!"); }else { System.out.println("使用者:"+num+"登入失敗!"); } }); } executorService.shutdown(); System.out.println("當前可用許可證數:"+loginQueue.availableSlots()); //此時已經登入了10個使用者,再次登入的時候會返回false if (loginQueue.tryLogin()){ System.out.println("登入成功!"); }else { System.out.println("系統登入使用者已滿,登入失敗!"); } //有使用者退出登入 loginQueue.logout();//再次登入 if (loginQueue.tryLogin()){ System.out.println("登入成功!"); }else { System.out.println("系統登入使用者已滿,登入失敗!"); } }
class LoginQueueUsingSemaphore{ private Semaphore semaphore; /** * * @param slotLimit */ public LoginQueueUsingSemaphore(int slotLimit){ semaphore=new Semaphore(slotLimit); } boolean tryLogin() { //獲取一個憑證 return semaphore.tryAcquire(); } void logout() { semaphore.release(); } int availableSlots() { return semaphore.availablePermits(); } }
有追求,才有動力!
向每一個軟體工程師致敬!
by wujf
mail:[email protected]