zoukankan      html  css  js  c++  java
  • Java多线程_Semaphore信号量

    概念:

    Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制。
    当Semaphore的个数变成1时,即代表只允许一个线程访问,这是Semaphore的功能就变成了Lock的功能。

    它有两个核心方法:

    • acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。
    • release() 释放一个许可。

    实例:
    给出这样一个实例:现有3个信号量,有6个线程去获取信号量,获取到就执行,没获取到就等待,直到有信号量被释放。

    import java.util.Random;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreDemo implements Runnable {
        Semaphore semaphore = new Semaphore(3);   //创建三个信号量
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "得到一个信号量");
            try {
                Thread.sleep(new Random().nextInt(2000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            semaphore.release();
            System.out.println(Thread.currentThread().getName() + "释放一个信号量");
        }
    
        public static void main(String[] args) {
            SemaphoreDemo sd = new SemaphoreDemo();
            ExecutorService service = Executors.newFixedThreadPool(6);
            while (true) {
                service.execute(sd);
            }
        }
    }

    我们来看一下运行结果:

    另外需要注意的一点:
    信号灯可以由一个线程使用,然后由另一个线程来进行释放,而锁只能由同一个线程启动和释放,不然就好发生死锁。

  • 相关阅读:
    Android 中Base64的操作
    android 异步图片处理 工具类
    android 跨应用跳转 启动其他应用指定界面
    C++代码案例
    Android 中 Base64的操作应用
    Python基础笔记1
    [linux] 大批量删除任务
    Python基础笔记3
    [R] 如何快速生成许多差异明显的颜色?
    Python基础笔记4
  • 原文地址:https://www.cnblogs.com/ericz2j/p/10295514.html
Copyright © 2011-2022 走看看