Semaphore使用过吗

    Semaphore,信号灯,也叫信号量,主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制,大家想一个生活中的例子,我们开车去超市买东西的时候,首先要把车停到超市的停车场中,停车场的车位是有限的,假设停车场有3个停车位,来了6辆车,总会有3辆车先抢到,后面的3辆车等待前边的3辆车开走后,才可以进入停车场停车,也就是java中多个线程抢多份有限的资源,我们来看一下6辆车抢三个停车位的demo。

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {

    public static void main(String[] args) throws Exception {

        Semaphore semaphore = new Semaphore(3);

        for (int i = 1; i < 7; i++) {

            new Thread(() -> {
                try {
                    semaphore.acquire();
                    System.err.println(Thread.currentThread().getName() + "\t抢到车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.err.println(Thread.currentThread().getName() + "\t停了3秒后离开车位");
                semaphore.release();

            }, "第" + i + "辆车").start();
        }

    }

}

    执行结果

第6辆车    抢到车位
第1辆车    抢到车位
第4辆车    抢到车位
第6辆车    停了3秒后离开车位
第2辆车    抢到车位
第1辆车    停了3秒后离开车位
第3辆车    抢到车位
第4辆车    停了3秒后离开车位
第5辆车    抢到车位
第2辆车    停了3秒后离开车位
第3辆车    停了3秒后离开车位
第5辆车    停了3秒后离开车位

    demo中,初始化3个资源的Semaphore类,当线程抢到资源后,需要调用acquire方法,当处理完成后,再调用release方法,释放锁,通知其他线程,这样就完成了多个线程抢占多个资源的例子,怎么样,不是很复杂把。

你可能感兴趣的:(java,JUC包下线程调度,java面试,java高级,Semaphore,多个线程抢占多个有限资源)