淺談Semaphore類 如何控制某個方法允許併發訪問執行緒的個數?
阿新 • • 發佈:2018-11-02
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請求操作"); }