【并发】Java并发编程Semaphore类 同时只能做X件事 限流

【并发】Java并发编程Semaphore类 同时只能做X件事 限流

场景

       食堂打饭, 总共3个打饭窗口, 100个学生, 同时只能让3个学生打饭

Semaphore sem = new Semaphore(3); //3个食堂窗口		    // 初始化一个信号量,拥有 10 个许可


for( 100 个学生打饭){



    sem.acquire();   //申请打饭 看看窗口是否被占用                               // 申请许可,如果当前没有许可了,则阻塞直至其他线程 release 以释放许可

//开始打饭
        thread= () -> {
                //打饭中......

                //结束打饭 释放窗口  释放许可,以供其他线程使用
                sem.release();
            }.start();
 // 只有申请并获得了许可的线程,才能进入此处执行业务逻辑,从而控制了并发性


}


public class SemaphoreDemo {
    public static void main(String[] args) {
        // 线程数量:停车位! 限流!
        Semaphore semaphore = new Semaphore(3);
 
        for (int i = 1; i <= 7; i++) {
            new Thread(() -> {
                try {
                    semaphore.acquire(); // acquire() 得到
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println(Thread.currentThread().getName() + "离开车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release(); // release() 释放
                }
            }, String.valueOf(i)).start();
        }
    }
}

你可能感兴趣的:(并发线程,java,开发语言)