1. 程式人生 > >淺談Semaphore類 如何控制某個方法允許併發訪問執行緒的個數?

淺談Semaphore類 如何控制某個方法允許併發訪問執行緒的個數?

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請求操作"); }