Semaphore

Semaphore(信號量)

     至關於阻塞隊列同樣,semaphore至關於一個令牌許可,若是你設置了20個許可,則一次最多隻能同時併發20個線程。初始令牌爲0,每次執行一個線程,則acquire一個令牌,若是令牌不夠,則阻塞,當線程用完的時候,release掉一個令牌。下面是Demo:java

public static void main(String[] args) throws Exception {

        ExecutorService executorService = Executors.newCachedThreadPool();

        Semaphore sem = new Semaphore(20);
        for (i = 0; i < 200; i++) {
            Runnable runnable = new Thread() {
                @Override
                public void run() {
                    try {
                        sem.acquire();   // 獲取令牌
                        System.out.printf("我拿到了令牌, 如今還剩下["+ sem.availablePermits() +"]\n");
                        Thread.sleep(2000);
                        sem.release();   // 釋放令牌
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            executorService.execute(runnable);
        }
    }
相關文章
相關標籤/搜索