如何控制某个方法允许并发访问线程的个数?
程序员文章站
2024-02-03 11:04:04
Semaphore类有两个重要方法 1、semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release()的时候,信号量不为0的时候才可以继续执行acquire 2、semaphore.release() ......
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请求操作"); }
下一篇: Java并发(三):重排序
推荐阅读