实现原理
Semaphore可以控制访问共享资源的并发数据,从Semaphore只获取到许可立即把任务放到线程池中去执行,线程池执行完任务则把Semaphore对应的许可释放.这做的目的是并发执行任务数据永远也不会大于线程池数量.(线程池无需等待队列)
演示代码(具体业务使用可以做一些抽象和接口封装)
public class SeamphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(10);
ExecutorService executorService = Executors.newFixedThreadPool(10);
while (true) {
try {
semaphore.acquire(1);
executorService.execute(() -> {
try {
System.out.println("do something" + "可以许可:" + semaphore.availablePermits());
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
});
} catch (InterruptedException e) {
e.printStackTrace();
semaphore.release();
}
}
}
}
代码运行接口
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
do something 可用许可:0
......