专栏首页吉林乌拉Semaphore的使用

Semaphore的使用

Semaphore的作用是控制线程的并发数量。在简单点的解释就是如果我们开始了10个线程都在处理任务,如果我们用到的Semaphore,那么可以让这10个并发任务执行的时候可以只同时执行2个。因为Semaphore的构造方法里需要传递一个int类型的参数,这个参数就是控制线程可以允许的同时并发数。

上述代码我们同时开启了3个线程,因为我们没有加同步方法所以这3个开启的线程是异步执行的。那么在实际的任务开发中,如果我们需要控制多线程的并发数量应该怎么办呢?例如我们在操作IO的时候可能会因为系统的内存或者磁盘等因素,导致我们的CPU占有率很高,这时我们就要调整线程的同时并发数,否则系统可能会卡死。这时我们就会用到Semaphore。它的使用方法也比较简单,当调用acquire()方法时,就是会获取由Semaphore颁发的许可证,当调用release()方法时就会把获取的许可证归还。Semaphore中的许可证数量是由创建Semaphore对象的构造方法的参数决定的。参数值是多少,就有多少个许可证,有多少个许可证,就可以同时有多少个线程并发执行,因为没有获得许可证的线程则不会执行。

我们看输出虽然我们开启了3个线程,但同时执行的线程任务只有2个,原因就是我们设置的Semaphore构造函数的参数为2。也就是说同时执行的任务只能是2个,如果有一个线程的任务已经执行完了,那么另一个线程才会执行。原因是上一个线程已经将许可证归还了,当前线程可以重新获取到许可证了。

本文分享自微信公众号 - 吉林乌拉(jilinwulacom)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-12

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ThreadPoolExecutor的使用

    ThreadPoolExecutor也就是线程池。它就是Java为我们开发多线程程序时提供的一个开发框架。它可以统一的管理线程的创建、销毁、优化、监控等,在使用...

    吉林乌拉
  • Java中的线程组

    在开发多线程时,可以用ThreadGroup关键字创建一个线程组来方便管理一系列的子线程,线程组可以统一的设置线程的某些属性。

    吉林乌拉
  • Executor的使用

    在上一篇我们简单的介绍了线程池的使用,虽然线程池比我们直接使用原始的线程类更加方便,但在创建线程池对象时对参数的设置是需要开发人员精心考量的,否则线程池并不会实...

    吉林乌拉
  • 1.有关线程、并发的基本概念

    什么是线程?   提到“线程”总免不了要和“进程”做比较,而我认为在Java并发编程中混淆的不是“线程”和“进程”的区别,而是“任务(Task)”。进程是表示资...

    用户1148394
  • 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统。也幸亏最近对线程有了一些学习,这次一接手就起到了作用。但是在实际的开发过程中还是发现了许多的问题,比如挂起与...

    用户1105954
  • bat等大公司常考多线程面试题【力荐】

    思考题:希望大家积极的思考,并且可以踊跃的说出自己的想法,想法不管对与错,只要说出来就是一种提高,所以,希望小伙伴们可以把自己的想法在留言区给出,这样大家也可以...

    好好学java
  • 理解Java并发工具类Semaphore

    Semaphore是Java里面另外一个基本的并发工具包类,主要的的作用是用来保护共享资源的访问的,也就是仅仅允许一定数量的线程访问共享资源。Semaphore...

    我是攻城师
  • 通俗易懂,各常用线程池的执行 流程图

    corePoolSize,maximumPoolSize,workQueue之间关系。

    林冠宏-指尖下的幽灵
  • 通俗易懂,各常用线程池的执行 流程图

    作者:林冠宏 / 指尖下的幽灵 腾讯云+社区:https://cloud.tencent.com/developer/user/1148436/activ...

    林冠宏-指尖下的幽灵
  • 并发编程-加锁机制

    本文翻译自《Java Concurrency ?In ?Practice》,定期放送 ,让你利用碎片时间悄悄的看了一本书! 我们的文章是系列的。所以先请允许...

    ImportSource

扫码关注云+社区

领取腾讯云代金券