Semaphore

Semaphore(信號量)是用來控制同時訪問特定資源的線程數量。java

import java.util.concurrent.*;

/**
 * Created by Administrator on 2017/5/22 0022.
 */
public class Test {

    private static final int THREAD_COUNT = 10;//併發爲10

    private static ExecutorService threadPool = Executors
            .newFixedThreadPool(THREAD_COUNT);

    private static Semaphore s = new Semaphore(3); //設置最大訪問量爲3個

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        s.acquire();
               Thread.sleep(3000); System.out.println(
"save data"); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }

從上面代碼看出來給它10個線程,可是每次只容許3個併發的執行。併發

經過上面例子,來分析一下源碼ide

構造函數

Semaphore(int permits) 接受一個整型的數字,表示可用的許可證數量,也是默認的非公平性模式函數

Semaphore(int permits,boolean fair)建立公平性仍是非公平性模式ui

acquire()

acquire()今後信號量獲取一個許可,在提供一個許可前一直將線程阻塞,不然線程被 中斷。獲取一個許可(若是提供了一個)並當即返回,將可用的許可數減 1。

若是沒有可用的許可,則在發生如下兩種狀況之一前,禁止將當前線程用於線程安排目的並使其處於休眠狀態:spa

release()
     方法,而且當前線程是下一個要被分配許可的線程;或者
  • 其餘某些線程中斷當前線程。

 

  • 被此方法將其已中斷狀態設置爲 on ;或者
  • 在等待許可時被中斷

InterruptedException,而且清除當前線程的已中斷狀態。 線程

拋出:
InterruptedException - 若是當前線程被中斷

 

 Semaphore還提供一些其餘方法:3d

  • int availablePermits() :返回此信號量中當前可用的許可證數。
  • int getQueueLength():返回正在等待獲取許可證的線程數。
  • boolean hasQueuedThreads() :是否有線程正在等待獲取許可證。
  • void reducePermits(int reduction) :減小reduction個許可證。是個protected方法。
  • Collection getQueuedThreads() :返回全部等待獲取許可證的線程集合。是個protected方法。
相關文章
相關標籤/搜索