zoukankan      html  css  js  c++  java
  • 浅谈Semaphore类

    Semaphore类有两个重要方法

    1、semaphore.acquire();

    请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire

    2、semaphore.release();

    释放一个信号量,这时候信号量个数+1,

    这个类使用的目的为:

    如何控制某个方法允许并发访问线程的个数?

    也就是说在线程里执行某个方法的时候,在方法里用该类对象进行控制,就能保证所有的线程中最多只有指定信号量个数个该方法在执行。

    举例:

    我开启了100个线程,执行一个showLog()方法,但是我只想要所有线程中,最多有五个线程在执行该方法,其他的线程就必须排队等待。

    则可以使用Semaphore对象进行控制,该对象new初始化的时候有个int参数,即指定最多信号量个数。

     private Semaphore semaphore;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            semaphore = new Semaphore(5);
    
            for (int i = 0; i < 1000; i++) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        showLog();
                    }
                }).start();
            }
    
    
        }
        private void showLog(){
            try {
                semaphore.acquire();
                Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个acquire请求操作");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 线程休眠1s
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            semaphore.release();
            Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作");
    
    
        }

  • 相关阅读:
    VestaCP中国用户遭到大量DDOS攻击
    ZooKeeper设置ACL权限控制
    linux rsync 指定用户名和密码的方式同步
    关于Apache HTTPD 2.2.15的部分漏洞修复建议
    AutoMapper官方文档(二)【升级指南】
    openssl升级
    MongoDB如何无缝版本升级
    mysql在线升级更新步骤
    手动升级kubernetes集群
    更新Docker容器
  • 原文地址:https://www.cnblogs.com/xqxacm/p/9894880.html
Copyright © 2011-2022 走看看