简介
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,同时有10个线程,但由于资源有限每次只能有三个线程在执行,其余的线程只能等待其他线程执行完后再执行,这个时候,我们就可以使用Semaphore来做流控,示例代码如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
*
* @author yihong
*semaphore 模拟信号灯,可以实现 需要限制当前并发数量的场景
*/
public class MyThreadSemaphore {
public static void main(String[] args) {
ExecutorService threadPool = Executors.newCachedThreadPool();
final Semaphore semaphore=new Semaphore(3);//new semaphore对象,并设置信号量为3
for(int i=1;i<=10;i++){
Runnable task=new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();//信号量占用
//semaphore.availablePermits() //当前可用的许可
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName() +" 进入,当前并发数:"+(3-semaphore.availablePermits()));
try {
Thread.sleep((long) (Math.random()*10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将离开");
semaphore.release();//信号量释放
System.out.println("线程"+Thread.currentThread().getName()+"已离开,当前并发数:"+(3-semaphore.availablePermits()));
}
};
threadPool.execute(task);
}
threadPool.shutdown();
}
}