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

2 Semaphore实现
上一篇 下一篇

猜你喜欢

热点阅读