Semaphore 类 位于java.util.concurrent.Semaphore包下面。
该类主要有两个重要的方法:
1.acquire();
该方法主要是将初始化Semaphore里面的信号量数量-1。0为界限,此时不会在执行该方法。
2.release();
该方法主要是将初始化Semaphore里面的信号量数量+1。
demo:
1.列如对线程执行顺序做限制:
import java.util.concurrent.Semaphore;
class Foo {
public Semaphore seam_first_two = new Semaphore(0);
public Semaphore seam_two_second = new Semaphore(0);
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
printFirst.run();
seam_first_two.release();
}
public void second(Runnable printSecond) throws InterruptedException {
seam_first_two.acquire();
printSecond.run();
seam_two_second.release();
}
public void third(Runnable printThird) throws InterruptedException {
seam_two_second.acquire();
printThird.run();
}
}
2.对当前线程数量执行进行限制:
限制当前只允许5个线程同时并发执行。
rivate 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();
}
//业务逻辑
semaphore.release(); 释放信号量此时 该线程业务结束
Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作");
}