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

  • 相关阅读:
    c中NULL,'\0'和0之间的区别. (the difference between NULL,'\0' and 0 in c)
    python 解析xml文件python parse xml.
    mysql升级 ,MySQL Error: #1558 Column count of mysql.proc is wrong. Expected 20, found 16.
    文献随笔15
    文献笔记11
    文献笔记16
    文献笔记13
    文献笔记17
    文献笔记20
    文献笔记19
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10150270.html
Copyright © 2011-2022 走看看