信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。 话不多说,直接上代码
public class SemaphoreDemo {public static void main(String[] args) {// 最多三个线程Semaphore semaphore = new Semaphore(3);for (int i = 0; i < 6; i++) {new Thread(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t抢车位");TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}, String.valueOf(i)).start();}}}
结果,semaphore可以控制并发数,设置最多3线程抢车位,抢到车位信号量-1,离开车位后信号量+1。
0 抢车位2 抢车位1 抢车位0 停车3秒后离开车位1 停车3秒后离开车位2 停车3秒后离开车位4 抢车位3 抢车位5 抢车位4 停车3秒后离开车位3 停车3秒后离开车位5 停车3秒后离开车位
