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(); for (int i = ; i < ; 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();
} catch (InterruptedException e) {
e.printStackTrace();
}
semaphore.release();
Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作"); }

浅谈Semaphore类-LMLPHP

05-04 05:31