Semaphore+ThreadPool实现任务处理限流

394 阅读1分钟

实现原理

Semaphore可以控制访问共享资源的并发数据,从Semaphore只获取到许可立即把任务放到线程池中去执行,线程池执行完任务则把Semaphore对应的许可释放.这做的目的是并发执行任务数据永远也不会大于线程池数量.(线程池无需等待队列)

演示代码(具体业务使用可以做一些抽象和接口封装)

public class SeamphoreTest {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(10);
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        while (true) {
            try {
                semaphore.acquire(1);
                executorService.execute(() -> {
                    try {
                        System.out.println("do something" + "可以许可:" + semaphore.availablePermits());
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        semaphore.release();
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
                semaphore.release();
            }
        }

    }
}

代码运行接口

do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
do something   可用许可:0
......