信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。 话不多说,直接上代码

    1. public class SemaphoreDemo {
    2. public static void main(String[] args) {
    3. // 最多三个线程
    4. Semaphore semaphore = new Semaphore(3);
    5. for (int i = 0; i < 6; i++) {
    6. new Thread(() -> {
    7. try {
    8. semaphore.acquire();
    9. System.out.println(Thread.currentThread().getName()+"\t抢车位");
    10. TimeUnit.SECONDS.sleep(3);
    11. System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");
    12. } catch (InterruptedException e) {
    13. e.printStackTrace();
    14. } finally {
    15. semaphore.release();
    16. }
    17. }, String.valueOf(i)).start();
    18. }
    19. }
    20. }

    结果,semaphore可以控制并发数,设置最多3线程抢车位,抢到车位信号量-1,离开车位后信号量+1。

    1. 0 抢车位
    2. 2 抢车位
    3. 1 抢车位
    4. 0 停车3秒后离开车位
    5. 1 停车3秒后离开车位
    6. 2 停车3秒后离开车位
    7. 4 抢车位
    8. 3 抢车位
    9. 5 抢车位
    10. 4 停车3秒后离开车位
    11. 3 停车3秒后离开车位
    12. 5 停车3秒后离开车位