经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
浅谈Semaphore类
来源:cnblogs  作者:听着music睡  时间:2018/11/3 10:08:12  对本文有异议

Semaphore类有两个重要方法

1、semaphore.acquire();

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

2、semaphore.release();

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

 

这个类使用的目的为:

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

 

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

举例:

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

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

 

 

  1. private Semaphore semaphore;
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. semaphore = new Semaphore(5);
  7. for (int i = 0; i < 1000; i++) {
  8. new Thread(new Runnable() {
  9. @Override
  10. public void run() {
  11. showLog();
  12. }
  13. }).start();
  14. }
  15. }
  16. private void showLog(){
  17. try {
  18. semaphore.acquire();
  19. Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个acquire请求操作");
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. // 线程休眠1s
  24. try {
  25. Thread.sleep(1000);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. semaphore.release();
  30. Log.i("xqxinfo","线程:"+Thread.currentThread().getName()+"执行了一个release请求操作");
  31. }

 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号