该类有如下一些特点:
1、Semaphore是带有Counting、相当于维护了一定数量的通行证、如上面举的例子里面的100辆车 2、该类的acquire方法是为了申请通行证的、该方法可能会Block(这里并没有使用synchronization、因为否则的话release也没法执行)、就是当通行证全部被申请完了之后。而对应的release方法则是释放通行证的、这样该方法执行后可能会让原来Block的acquire方法得以继续执行。 3、上面2的执行过程中其实并没有类似于通行证这样的对象、Semaphore只是维护了一个许可的计数器。 4、如果Semaphore的计数器为1(又叫binary Semaphore)的话则相当于一个互斥锁 实际应用中、对象池和线程池都有使用如此的方式控制线程的使用量。
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请求操作"); }