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

Java 线程并发 常用辅助类 (三) Semaphore

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

Java 线程并发 常用辅助类 (三) Semaphore

定义解释:

一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。每个release()添加许可证,潜在地释放阻塞获取方。但是,没有使用实际的许可证对象;Semaphore只保留可用数量的计数,并相应地执行。

构造方法:

构造方法
Constructor and Description
Semaphore(int permits)

创建一个 Semaphore与给定数量的许可证和非公平公平设置。

Semaphore(int permits, boolean fair)

创建一个 Semaphore与给定数量的许可证和给定的公平设置。

方法摘要
所有方法 接口方法 具体的方法
Modifier and TypeMethod and Description
voidacquire()

从该信号量获取许可证,阻止直到可用,或线程为 interrupted 。

voidacquire(int permits)

从该信号量获取给定数量的许可证,阻止直到所有可用,否则线程为 interrupted 。

voidacquireUninterruptibly()

从这个信号灯获取许可证,阻止一个可用的。

voidacquireUninterruptibly(int permits)

从该信号量获取给定数量的许可证,阻止直到所有可用。

intavailablePermits()

返回此信号量中当前可用的许可数。

intdrainPermits()

获取并返回所有可立即获得的许可证。

protected CollectiongetQueuedThreads()

返回一个包含可能正在等待获取的线程的集合。

intgetQueueLength()

返回等待获取的线程数的估计。

booleanhasQueuedThreads()

查询任何线程是否等待获取。

booleanisFair()

如果此信号量的公平设置为真,则返回 true 。

protected voidreducePermits(int reduction)

缩小可用许可证的数量。

voidrelease()

释放许可证,将其返回到信号量。

voidrelease(int permits)

释放给定数量的许可证,将其返回到信号量。

StringtoString()

返回一个标识此信号量的字符串及其状态。

booleantryAcquire()

从这个信号量获得许可证,只有在调用时可以使用该许可证。

booleantryAcquire(int permits)

从这个信号量获取给定数量的许可证,只有在调用时全部可用。

booleantryAcquire(int permits, long timeout, TimeUnit unit)

从该信号量获取给定数量的许可证,如果在给定的等待时间内全部可用,并且当前线程尚未 interrupted 。

booleantryAcquire(long timeout, TimeUnit unit)

如果在给定的等待时间内可用,并且当前线程尚未 到达 interrupted,则从该信号量获取许可。

代码示范:打疫苗

 public static void main(String[] args) {
        
        //只有三个房间可以打疫苗,每次只能进去一个人
        Semaphore semaphore=new Semaphore(3);  //表示只能用三个信号

        for(int i=1;i<=6;i++){
            new Thread(()->{
                try {
                    //进入房间打针
                    semaphore.acquire();  //接收到可以执行的信号
                    System.out.println(Thread.currentThread().getName()+":进入房间打针");
                    //打针用了两秒钟
                    TimeUnit.SECONDS.sleep(2);
                    //打完针离开了房间
                    System.out.println(Thread.currentThread().getName()+":离开房间");


                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {

                    semaphore.release();//释放可以执行的信号
                }

            },String.valueOf(i)).start();

        }


    }

以上代码很简单,主要为了方便记住该类是做什么的,有什么用。

最后切记一点:

单元测试中使用 TimeUnit.SECONDS.sleep(3);

一定要在外面主线程中进行等待,否则,主线程执行完单元测试内的线程没执行完,那就真完了。

三种方法:

1.加上Thread.join()

2.CountDownLetch()

3.外面也加上睡眠时间,时长要大 如:

@Test
    public void time01(){

        new Thread(()->{
            System.out.println("开始:");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("过了两秒:");

        }).start();

        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

完结撒花,如有不对,请评判指正

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

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

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