zoukankan      html  css  js  c++  java
  • JAVA Semaphore

      semaphore['seməfɔ:(r)] 是信号的意思。

      在JAVA里面,我的理解是信号计数的作用,比如我想设置只能允许500个线程访问WebServer,那么如何控制500个数量哪?每来一个请求,就通过acquire()获取一个许可,然后数量自动减一,处理完成之后通过release()释放一个许可,数量自动加一。这样就实现了控制的作用,当然这个功能咱们自己通过锁的机制可以自己完成,不过使用Semaphore比较简单、方便,这也是它产生的原因。好了废话少说,写一段代码看看。

    Test.java

    package com.taobao;
    
    import java.util.concurrent.ExecutorService;
    
    import java.util.concurrent.Executors;
    
    import java.util.concurrent.Semaphore;
    /**
     * Semaphore 信号量测试代码
     * @author liqiu
     *
     */
    public class Test implements Runnable {
        // 只能5个线程同时访问
        Semaphore semp = new Semaphore(5);
        int num = 0;
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                // 获取许可
                semp.acquire();
                System.out.println("这是第几个线程:" + this.num++);
                //System.out.println(this.num);
                Thread.sleep((long) (Math.random() * 10000));
                // 访问完后,释放
                semp.release();
                System.out.println("空闲线程的数量:" + semp.availablePermits());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
        }
        
        public static void main(String[] args) {
            // 线程池
            ExecutorService exec = Executors.newCachedThreadPool();
            Test test = new Test();
            // 模拟20个客户端访问
            for (int index = 0; index < 10; index++) {
                System.out.println("开启了第几个线程:"+index);
                exec.execute(test);
            }
            // 退出线程池
            exec.shutdown();
    
        }
    }

    执行的结果:

    开启了第几个线程:0
    开启了第几个线程:1
    这是第几个线程:0
    开启了第几个线程:2
    这是第几个线程:1
    开启了第几个线程:3
    这是第几个线程:2
    开启了第几个线程:4
    这是第几个线程:3
    开启了第几个线程:5
    这是第几个线程:4
    开启了第几个线程:6
    开启了第几个线程:7
    开启了第几个线程:8
    开启了第几个线程:9
    空闲线程的数量:1
    这是第几个线程:5
    空闲线程的数量:1
    这是第几个线程:6
    空闲线程的数量:1
    这是第几个线程:7
    空闲线程的数量:1
    这是第几个线程:8
    空闲线程的数量:1
    这是第几个线程:9
    空闲线程的数量:1
    空闲线程的数量:2
    空闲线程的数量:3
    空闲线程的数量:4
    空闲线程的数量:5

      解释一下上面用到的几个函数:

      availablePermits(): 返回空闲线程的数量

      acquire(): 申请线程

      release(): 释放线程

      Executors.newCachedThreadPool(): 创建一个线程池,这个与本文没有什么关系

  • 相关阅读:
    《通往衰败之路》读后感 读书笔记
    《苏世民我的经验与教训》读后感 读书笔记
    《红星照耀中国》读后感 读书笔记
    《上帝之子》读后感 读书笔记
    《两兄弟》读后感 读书笔记
    《好的经济学》读后感 读书笔记
    JSON 使用 教程
    JSON 使用
    JSON 语法
    Json
  • 原文地址:https://www.cnblogs.com/liqiu/p/3649095.html
Copyright © 2011-2022 走看看