当前位置: 移动技术网 > IT编程>开发语言>Java > 如何控制某个方法允许并发访问线程的个数?

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

2018年11月03日  | 移动技术网IT编程  | 我要评论

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


    }

 

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网