タイトルなど:単一のJavaアプリケーションの場合、メソッドmethodA()の1つの同時呼び出しの数を100を超えないように制限するにはどうすればよいですか。100を超えると、超過した要求は直接nullを返すか、例外をスローします。
private static Semaphore semaphore = new Semaphore(100);
public static Integer methodA() {
if(!semaphore.tryAcquire()) {
return null;
}
try {
// TODO 方法中的业务逻辑
} finally {
semaphore.release();
}
}
概念的には、セマフォはいくつかの許可を保持することと同じです。スレッドは、セマフォオブジェクトのacquire()メソッドを呼び出して許可を取得し、release()を呼び出して許可を返すことができます。
1工法:
Semaphoreには、Semaphore(int)とSemaphore(int、boolean)の2つの構築方法があります。パラメーターのintは、Semaphoreが持つライセンスの数を示し、booleanは、ライセンスを取得することが公正であるかどうかを示します。公正である場合は、複数のスレッドがライセンスを取得する場合、スレッドが来る順序に従ってライセンスが割り当てられます。そうでない場合、スレッドがライセンスを取得する順序は不確実です。
2ライセンスの取得
取得には、acquire()、acquire(int)、tryAcquire()などを使用できます。intパラメーターは、一度に複数のライセンスを取得することを示し、デフォルトは1です。acquireメソッドは、ライセンスなしでライセンスを取得する必要があるスレッドです。ブロックし、権限がない場合、tryAcquire()メソッドはすぐにfalseを返し、権限を取得するスレッドはブロックされません。
3リリースライセンス
スレッドはrelease()、release(int)を呼び出して、ライセンスを解放(返す)できます。スレッドは、release()を呼び出す前にacquireを呼び出す必要がないことに注意してください。
通常、スレッドプールで使用されます。
- ルーキーとして、多くの場所がよく理解されていないことは避けられません。テキストに誤りがある場合は、直接(bu)、次に(yao)、(ma)out(wo)してください。