Java 的并發(fā)包下,提供一個工具類:Semaphore,可用于控制并發(fā)數(shù)量,即同時訪問特定資源的線程數(shù)量,通過協(xié)調(diào)各個線程,保證合理使用公共資源。
比如以數(shù)據(jù)庫連接池為例,現(xiàn)有30個線程請求數(shù)據(jù)庫連接,但連接池的最大連接數(shù)為10,故會有20個線程請求失敗。為控制連接數(shù),可用Semaphore操作。
Semaphore 中有個計數(shù)器,表示可用的許可證數(shù)量。 調(diào)用acquire()方法,可以獲取許可證,使用完后調(diào)用release()方法,釋放許可證。
package com.myConcurrent.demo.concurrentUtils;
import java.util.concurrent.Semaphore;
/**
* @author fenghongyu
* 控制線程的并發(fā)連接數(shù)
*/
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();
}
}