JUC--Semaphore的使用及源码分析

1前言

针对sychronized和ReentrantLock我们可以看见再同一时候就只能够有一个线程获得资源进行使用,那么如果我们想要在同一时刻有多个线程来使用资源,这个时候要怎么办呢?这就需要用到我们的信号量Semaphore。

2使用实例
下面展示具体的使用方法:
package com.liutao.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 演示信号量Semaphore的使用
 */
public class SemaphoreDemo {
    static final Semaphore semp = new Semaphore(5);
    public static class SempDemo implements Runnable{

        @Override
        public void run() {
            try {
                semp.acquire();
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getId()+":done!");
                semp.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        final SempDemo sempDemo = new SempDemo();
        for (int i = 0;i<20;i++){
            executorService.submit(sempDemo);
        }
    }
}

运行代码,我们可以看见执行结果是五个一组进行输出的。
12:done!
15:done!
14:done!
13:done!
11:done!
17:done!
16:done!
18:done!
20:done!
19:done!
22:done!
24:done!
23:done!
21:done!
25:done!
26:done!
28:done!
29:done!
27:done!
30:done!

3源码分析

猜你喜欢

转载自blog.csdn.net/onroad0612/article/details/80359551