Semaphore類有兩個重要方法
1、semaphore.acquire();
請求一個信號量,這時候信號量個數-1,當減少到0的時候,下一次acquire不會再執行,只有當執行一個release()的時候,信號量不為0的時候才可以繼續執行acquire
2、semaphore.release();
釋放一個信號量,這時候信號量個數+1,
這個類使用的目的為:
如何控制某個方法允許並發訪問線程的個數?
也就是說在線程里執行某個方法的時候,在方法里用該類對象進行控制,就能保證所有的線程中最多只有指定信號量個數個該方法在執行。
舉例:
我開啟了100個線程,執行一個showLog()方法,但是我只想要所有線程中,最多有五個線程在執行該方法,其他的線程就必須排隊等待。
則可以使用Semaphore對象進行控制,該對象new初始化的時候有個int參數,即指定最多信號量個數。
private Semaphore semaphore; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); semaphore = new Semaphore(5); for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { @Override public void run() { showLog(); } }).start(); } } private void showLog(){ try { semaphore.acquire(); Log.i("xqxinfo","線程:"+Thread.currentThread().getName()+"執行了一個acquire請求操作"); } catch (InterruptedException e) { e.printStackTrace(); } // 線程休眠1s try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } semaphore.release(); Log.i("xqxinfo","線程:"+Thread.currentThread().getName()+"執行了一個release請求操作"); }