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


    }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM