• 多线程-信号量Semaphore


      计数信号量用来控制同时访问某个特定资源的操作数量。Semaphore可以用于实现资源池,例如数据库连接池。我们可以构造一个固定长度的资源池,当资源池为空的时候,请求资源将会阻塞,而不是失败。当资源池非空的时候解除阻塞。如果将Semaphore的计数值初始化为池的大小,在池中获取一个资源之前首先调用Semopore.acquire()方法获取一个许可,当池为空的时候将阻塞到池非空为止。使用完毕的时候,调用Semophore.release()方法释放许可。

      信号量好比现在厕所就有5个坑,等待上厕所的人数为10。因为每次只能同时5个人占用坑,所以其他10人必须等待,直到5个人中有一个人使用完,另外10个人中的一人才能去使用坑,以此类推。下面用代码模拟以下,如下:

    package semaphore.semaphore;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    public class SemaphoreDemo {
    
        public static void main(String[]args){
            //线程池
            ExecutorService exec=Executors.newCachedThreadPool();
            //初始化信号量
            final Semaphore semaphore=new Semaphore(5);
            //开启10个线程
            for(int i=1;i<=10;i++){
                final int num=i;
                Thread thread=new Thread(new Runnable() {
                    public void run() {
                        try {
                            //获取许可
                            semaphore.acquire();
                            System.out.println("Accessing:"+num);
                            Thread.sleep((long) (Math.random()*10000));
                            //访问完毕释放
                            semaphore.release();
                            System.out.println("----------"+num);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
                exec.execute(thread);
            }
            exec.shutdown();
        }
    }

      运行结果如下:

      

       参考地址:JAVA并发编程实战

            http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

  • 相关阅读:
    C# 随机生成姓名的方法
    Task 异步编程测试案例及基础应用说明
    C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?
    C# SignalR 即时通信
    C#中out和ref之间的区别
    LInq之Take Skip TakeWhile SkipWhile Reverse Union Concat 用法
    C# LINQ 详解 From Where Select Group Into OrderBy Let Join
    JS 数组去重的几个方法
    attachEvent和addEventListener区别
    Event事件跨浏览器封装
  • 原文地址:https://www.cnblogs.com/gdpuzxs/p/6992778.html
Copyright © 2020-2023  润新知