如何控制某个方法允许并发访问线程的个数?

这个完全考验对并发三大辅助类的应用:

semaphore两个重要的方法就是

semaphore.acquire() 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)

semaphore.release() 释放一个信号量,此时信号量个数+1

public class currentTest {

    static final Semaphore semaphore = new Semaphore(5, true);


    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // 申请一个请求
                    try {
                        semaphore.acquire();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "进来了");

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "走了");
                    // 释放一个请求
                    semaphore.release();
                }
            }).start();
        }
    }


}

  

构造函数创建了一个 Semaphore 对象,并且初始化了 5 个信号。这样的效果是控件 test 方法最多只能有 5 个线程并发访问,对于 5 个线程时就排队等待,走一个来一下;

请求一个信号(消费一个信号),如果信号被用完了则等待;

释放一个信号,释放的信号新的线程就可以使用了.

posted @ 2025-05-29 18:06  IT路上的小白  阅读(26)  评论(0)    收藏  举报