1. 程式人生 > 其它 >多執行緒之Semaphore登入限流示例

多執行緒之Semaphore登入限流示例

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++) {
            final 
int 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]