Java并发组件三之Semaphore

  • 使用场景:常用于使用有限的资源,限制线程并发的最大数量。
    默认情况下,信号量是非公平性的(先等待先执行为公平。类似于买东西的时候大家排队付款,先来的先付款是公平的。但是这时候有人插队,那就是非公平的)

    设定信号量的最大个数:Semaphore semaphore=new Semaphore(3);
  1. 获取信号量:
  2. semaphore.acquire(); //获取信号量
  3. semaphore.acquire(3); //获取多个许可
  4. semaphore.tryAcquire(3); //尝试获取多个许可
  5. semaphore.tryAcquire(5, TimeUnit.SECONDS); //给定时间内获取许可
  6. 释放信号量:semaphore.release();

代码:
public class T11_TestSemaphore {
    public static void main(String[] args) {
        //Semaphore s = new Semaphore(2);
        Semaphore s = new Semaphore(2, true);
        //允许一个线程同时执行
        //Semaphore s = new Semaphore(1);
        new Thread(()->{
            try {
                s.acquire();
                System.out.println("T1 running...");
                Thread.sleep(200);
                System.out.println("T1 running...");

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                s.release();
            }
        }).start();
        new Thread(()->{
            try {
                s.acquire();
                System.out.println("T2 running...");
                Thread.sleep(200);
                System.out.println("T2 running...");
                s.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

 

posted @ 2020-04-18 16:03  等不到的口琴  阅读(180)  评论(0编辑  收藏  举报