zoukankan      html  css  js  c++  java
  • 并发编程-concurrent指南-信号量Semaphore

    Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

    acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。

    release()用来释放许可。注意,在释放许可之前,必须先获获得许可。

    下面通过一个例子来看一下Semaphore的具体使用:

    假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:

    import java.util.concurrent.Semaphore;
    
    public class Main {
        public static void main(String[] args) {
            Semaphore semaphore = new Semaphore(5);//5台机器
    
            //8个工人工作
            for(int i=0;i<8;i++){
                new Thread(new Worker(semaphore)).start();
            }
        }
    }
    import java.util.Random;
    import java.util.concurrent.Semaphore;
    import java.util.concurrent.TimeUnit;
    
    /**
     * 工人
     */
    public class Worker implements Runnable{
        private Semaphore semaphore;
        public Worker(Semaphore semaphore){
            this.semaphore = semaphore;
        }
    
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName()+"占用一个机器生产。。。");
                int random = new Random().nextInt(10);
                TimeUnit.SECONDS.sleep(random);
                System.out.println(Thread.currentThread().getName()+"释放出机器");
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    适用场景:

    Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

    源码地址:https://github.com/qjm201000/concurrent_semaphore.git

  • 相关阅读:
    Redis集群~StackExchange.redis连接Twemproxy代理服务器
    开源的Android视频播放器
    Servlet 实现文件的上传与下载
    HDU1878 欧拉回路
    C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)
    Windows API获取系统配置文件的配置参数
    Lucene核心--构建Lucene搜索(下篇,理论篇)
    Lucene核心--构建Lucene搜索(上篇,理论篇)
    hdu1397(素数组和成偶数的个数 用 标记法)
    hdu1248
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10150270.html
Copyright © 2011-2022 走看看