信号量,用来限制能同时访问共享资源的线程上限。

    1. public static void main(String[] args) {
    2. // 1. 创建 semaphore 对象
    3. Semaphore semaphore = new Semaphore(3);
    4. // 2. 10个线程同时运行
    5. for (int i = 0; i < 10; i++) {
    6. new Thread(() -> {
    7. try {
    8. semaphore.acquire();
    9. } catch (InterruptedException e) {
    10. e.printStackTrace();
    11. }
    12. try {
    13. log.debug("running...");
    14. sleep(1);
    15. log.debug("end...");
    16. } finally {
    17. semaphore.release();
    18. }
    19. }).start();
    20. }
    21. }

    输出

    1. 07:35:15.485 c.TestSemaphore [Thread-2] - running...
    2. 07:35:15.485 c.TestSemaphore [Thread-1] - running...
    3. 07:35:15.485 c.TestSemaphore [Thread-0] - running...
    4. 07:35:16.490 c.TestSemaphore [Thread-2] - end...
    5. 07:35:16.490 c.TestSemaphore [Thread-0] - end...
    6. 07:35:16.490 c.TestSemaphore [Thread-1] - end...
    7. 07:35:16.490 c.TestSemaphore [Thread-3] - running...
    8. 07:35:16.490 c.TestSemaphore [Thread-5] - running...
    9. 07:35:16.490 c.TestSemaphore [Thread-4] - running...
    10. 07:35:17.490 c.TestSemaphore [Thread-5] - end...
    11. 07:35:17.490 c.TestSemaphore [Thread-4] - end...
    12. 07:35:17.490 c.TestSemaphore [Thread-3] - end...
    13. 07:35:17.490 c.TestSemaphore [Thread-6] - running...
    14. 07:35:17.490 c.TestSemaphore [Thread-7] - running...
    15. 07:35:17.490 c.TestSemaphore [Thread-9] - running...
    16. 07:35:18.491 c.TestSemaphore [Thread-6] - end...
    17. 07:35:18.491 c.TestSemaphore [Thread-7] - end...
    18. 07:35:18.491 c.TestSemaphore [Thread-9] - end...
    19. 07:35:18.491 c.TestSemaphore [Thread-8] - running...
    20. 07:35:19.492 c.TestSemaphore [Thread-8] - end...