Java并发组件三之Semaphore
-
使用场景:常用于使用有限的资源,限制线程并发的最大数量。
默认情况下,信号量是非公平性的(先等待先执行为公平。类似于买东西的时候大家排队付款,先来的先付款是公平的。但是这时候有人插队,那就是非公平的)
设定信号量的最大个数:Semaphore semaphore=new Semaphore(3);
- 获取信号量:
- semaphore.acquire(); //获取信号量
- semaphore.acquire(3); //获取多个许可
- semaphore.tryAcquire(3); //尝试获取多个许可
- semaphore.tryAcquire(5, TimeUnit.SECONDS); //给定时间内获取许可
- 释放信号量: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(); } }