浅谈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请求操作");


    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏于晓飞的专栏

Android开发从GC root分析内存泄漏

我们常说的垃圾回收机制中会提到GC Roots这个词,也就是Java虚拟机中所有引用的根对象。我们都知道,垃圾回收器不会回收GC Roots以及那些被它们间接引...

2602
来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 14 Site is incorrect!编辑器启动报错!

最近在弄编辑器的时候出现了一个十分尴尬的错误!这里收录一下:   BUG如下图所示: ?   目测堆栈,与自己开发的代码无关。完全是Eclipse自己初始...

2226
来自专栏何俊林

原来Android还可以这样通过反射,获取jar包属性及方法

1、写一个java类,生成Jar包 2、初始Jar的转换 3、创建一个android工程 4、复制Jar包 5、反射获取属性和方法 5、完整Demo 6、补充 ...

5625
来自专栏微信公众号:Java团长

Java类加载器详解(下)

这个类中定义了一个加密和解密的算法,很简单的,就是将字节和oxff异或一下即可,而且这个算法是加密和解密的都可以用,很是神奇呀!

1503
来自专栏小灰灰

EventBus源码学习笔记(二)

EventBus深入学习二 开始研究源码的设计思路,从Listener注册出发,EventBus 如何维护监听者信息,到Publisher发送消息,消息以怎样...

2675
来自专栏流媒体

Resources和AssetManager创建过程

到这里AssetManager创建完毕。然后设置相关的路径 AssetManager assets = new AssetManager(); // res...

1195
来自专栏向治洪

ormlite介绍一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http...

2136
来自专栏pangguoming

Android Data Binding(数据绑定)用户指南

1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件。 Data B...

4258
来自专栏阿杜的世界

Spring Bean的生命周期管理

Spring Bean存活于容器之中,一般情况下spring bean对context的情况并不了解,如果希望某个bean知道自己在context中的代号:be...

942
来自专栏androidBlog

Android 常用工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1641

扫码关注云+社区

领取腾讯云代金券