并发编程系列之Semaphore用法简介

x33g5p2x  于2021-12-30 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(460)

1、Semaphore计数信号量定义

理解:就是要给令牌池,可获取信号量(令牌或者许可)、放入信号量。常用于控制并发的线程数,也可用于池类资源的访问控制。

2、Semaphore用法api

  • 构造方法

  • Semaphore(int permits):指定初始许可数

  • Semaphore(int permits , boolean fair):指定是否公平模式

  • 尝试获取许可

  • boolean tryAcquire(long timeout , TimeUnit unit)

  • boolean tryAcquire(int permits)

  • boolean tryAcquire(int permits, long timeout , TimeUnit unit)

  • 获取许可

  • void acquire() throws InterruptedException;:获取1个许可,可中断

  • void acquire(int permits) throws InterruptedException;:获取指定数量的许可,可中断

  • void acquireUninterruptibly():获取1个许可,不可中断

  • void acquireUninterruptibly(int permits)

  • int drainPermits():获取当前所有可用的

  • 放入许可

  • void release():放入1个

  • void release(int permits):放入多个

  • 其它API

  • boolean isFair()

  • int availablePermits

  • boolean hasQueuedThreads()

  • int getQueueLength()

  • Collection<Thread> getQueuedThreads()

3、Semaphore例子

场景:一个共享汽车场地有10辆汽车,但是有20个人需要借车,一辆汽车只能被一个人租赁,只有使用还车之后,其他人才能继续使用租赁

  1. import java.util.Random;
  2. import java.util.concurrent.Semaphore;
  3. /** * <pre> * Semaphore example * </pre> * * <pre> * @author mazq * 修改记录 * 修改后版本: 修改人: 修改日期: 2021/11/30 14:16 修改内容: * </pre> */
  4. public class SemaphoreExample {
  5. // 公平模式
  6. private Semaphore semaphore = new Semaphore(10, true);
  7. private final Random random = new Random();
  8. public void userCar() throws InterruptedException {
  9. System.out.println(Thread.currentThread().getName() + "需要用车");
  10. long start = System.currentTimeMillis();
  11. // 获取许可
  12. semaphore.acquire();
  13. System.out.println(Thread.currentThread().getName() + "租车成功,等待了:" +(System.currentTimeMillis() - start));
  14. try {
  15. Thread.sleep(random.nextInt(10_000));
  16. }catch (InterruptedException e) {
  17. } finally {
  18. System.out.println(Thread.currentThread().getName() + "还车了!");
  19. // 释放许可
  20. semaphore.release();
  21. }
  22. }
  23. public static void main(String[] args) {
  24. final Random ran = new Random();
  25. final SemaphoreExample semaphoreExample = new SemaphoreExample();
  26. for (int i = 0; i < 20 ; i++) {
  27. new Thread(()-> {
  28. try {
  29. Thread.sleep(ran.nextInt(5_000));
  30. semaphoreExample.userCar();
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }).start();
  35. }
  36. }
  37. }
  1. Thread-8需要用车
  2. Thread-8租车成功,等待了:0
  3. Thread-1需要用车
  4. Thread-1租车成功,等待了:0
  5. Thread-12需要用车
  6. Thread-12租车成功,等待了:0
  7. Thread-6需要用车
  8. Thread-6租车成功,等待了:0
  9. Thread-13需要用车
  10. Thread-13租车成功,等待了:0
  11. Thread-15需要用车
  12. Thread-15租车成功,等待了:0
  13. Thread-19需要用车
  14. Thread-19租车成功,等待了:0
  15. Thread-5需要用车
  16. Thread-5租车成功,等待了:0
  17. Thread-18需要用车
  18. Thread-18租车成功,等待了:0
  19. Thread-0需要用车
  20. Thread-0租车成功,等待了:0
  21. Thread-7需要用车
  22. Thread-11需要用车
  23. Thread-10需要用车
  24. Thread-13还车了!
  25. Thread-7租车成功,等待了:461
  26. Thread-14需要用车
  27. Thread-2需要用车
  28. Thread-3需要用车
  29. Thread-4需要用车
  30. Thread-15还车了!
  31. Thread-11租车成功,等待了:1291
  32. Thread-0还车了!
  33. Thread-10租车成功,等待了:1601
  34. Thread-9需要用车
  35. Thread-10还车了!
  36. Thread-14租车成功,等待了:2008
  37. Thread-17需要用车
  38. Thread-16需要用车
  39. Thread-11还车了!
  40. Thread-2租车成功,等待了:2858
  41. Thread-6还车了!
  42. Thread-3租车成功,等待了:2513
  43. Thread-8还车了!
  44. Thread-4租车成功,等待了:3218
  45. Thread-7还车了!
  46. Thread-9租车成功,等待了:2420
  47. Thread-12还车了!
  48. Thread-17租车成功,等待了:3266
  49. Thread-3还车了!
  50. Thread-16租车成功,等待了:3329
  51. Thread-19还车了!
  52. Thread-1还车了!
  53. Thread-17还车了!
  54. Thread-5还车了!
  55. Thread-4还车了!
  56. Thread-18还车了!
  57. Thread-2还车了!
  58. Thread-14还车了!
  59. Thread-9还车了!
  60. Thread-16还车了!

相关文章