Java 的并发包下,提供一个工具类:Semaphore,可用于控制并发数量,即同时访问特定资源的线程数量,通过协调各个线程,保证合理使用公共资源。
比如以数据库连接池为例,现有30个线程请求数据库连接,但连接池的最大连接数为10,故会有20个线程请求失败。为控制连接数,可用Semaphore操作。
Semaphore 中有个计数器,表示可用的许可证数量。 调用acquire()方法,可以获取许可证,使用完后调用release()方法,释放许可证。
package com.myConcurrent.demo.concurrentUtils;
import java.util.concurrent.Semaphore;
/**
* @author fenghongyu
* 控制线程的并发连接数
*/
public class SemaphoreDemo {
public void controlConnectionNum() {
int maxConnectionNum = 10;
int threadNum = 30;
Semaphore semaphore = new Semaphore(maxConnectionNum);
for(int i=0;i<threadNum;i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println("--------connection to mysql");
Thread.sleep(1000);
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
public static void main(String[] args) {
SemaphoreDemo demo = new SemaphoreDemo();
demo.controlConnectionNum();
}
}