java信号量限流
2019-07-11 本文已影响0人
JTwooooo
1、单机使用Semaphore进行限流:
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreLimiter {
private final Semaphore permit = new Semaphore(10, true);
public void process(int i) {
try {
permit.acquire(); // 阻塞的方式
System.out.println("处理逻辑" + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void processTry(int i) {
boolean acquired = permit.tryAcquire();
if (acquired) {
try {
System.out.println("处理业务逻辑" + i);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("释放信号量");
permit.release();
}
} else {
System.out.println("降级处理");
}
}
public static void main(String[] args) {
Executor executors = Executors.newFixedThreadPool(50);
SemaphoreLimiter sl = new SemaphoreLimiter();
for (int i = 0; i < 1000; i++) {
final int num = i;
executors.execute(new Runnable() {
@Override
public void run() {
//sl.process(num);
sl.processTry(num);
}
});
}
}
}
使用Semaphore信号量进行限流
accquire tryAcquire release