使用场景:可以控制访问特定资源的线程数量。
示例:有一条窄道,一次只能允许通行两辆车,通行前由管理员发通行证,通行后归还通行证。
public class SemaphoreDemo { public static void main(String[] args) { MyRunnable mr = new MyRunnable(); for (int i = 0; i < 100; i++) { new Thread(mr).start(); } } }
public class MyRunnable implements Runnable { // 1、获得管理员对象 Semaphore(2):参数表示当前只允许两个线程执行 private Semaphore s = new Semaphore(2); @Override public void run() { try { // 获得通行证 s.acquire(); // 开始行驶 System.out.println("开始行驶"); // 行驶需要时间,睡0.2秒 Thread.sleep(200); // 行驶通过后归还通行证 System.out.println("归还通行证"); s.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }