栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JUC之Semaphore信号量

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JUC之Semaphore信号量

1.1 JUC是什么?
JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题! 2.2 Semaphore(信号量)

Semaphore(信号量) 是一个计数信号量,它的本质是一个“共享锁“。信号量维护了一个信号量许可集。线程可以通过调用 acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
 

下面我们还看一段小程序:

package JUC;

import java.util.concurrent.Semaphore;


public class SemaphoreTest {
    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(2);
    for (int j = 0; j <3 ; j++) {
            new Thread(()->{
                try {
                    semaphore.acquire(); //可以设定参数指定许可证数量
                    System.out.println("get a license...");
                    Thread.sleep(100);
                    semaphore.release();  //可以设定参数指定许可证数量
                    System.out.println("release a license...");
                } catch (InterruptedException exception) {
                    exception.printStackTrace();
                }
            }).start();
        }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 获取剩余许可证数量
        System.out.println(semaphore.availablePermits());
        // 是否有等待线程
        System.out.println(semaphore.hasQueuedThreads());
        // 等待线程数量
        System.out.println(semaphore.getQueueLength());
    }

运行结果:

get a license...
get a license...
0
true
1
release a license...
get a license...
release a license...
release a license...

Process finished with exit code 0

在程序中我只放了两个“通行证”,也就是说只有两个线程能够同时进入代码块,另外一个线程没有获取到信号量,就会处于阻塞状态。在以往的多线程案例中,我们一般只允许一个线程进入代码块,而Semaphore信号量可以帮助我们解决需要多个线程同时处理的问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007666.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号