笔记 第14章 多线程(12) 信号量Semaphore与倒计时门栓CountDownLatch

编程入门 行业动态 更新时间:2024-10-09 17:25:17

笔记 第14章 多线程(12) <a href=https://www.elefans.com/category/jswz/34/1769130.html style=信号量Semaphore与倒计时门栓CountDownLatch"/>

笔记 第14章 多线程(12) 信号量Semaphore与倒计时门栓CountDownLatch

 

 14.10 同步器

Java.util.concurrent 包中有一些包含预支功能的线程集相关的类型

CyclicBarrier

公共栅栏,可以约定指定书目的线程到达指定起点后再执行

CountDownLatch

线程集等待知道计数器变0

Exchanger

交换两个线程对象

Semaphore

线程集等待直到允许继续运行

SynchronousQueue

线程把对象交给另一个线程

 14.10.1 信号量

相当于有限的许可证,通过颁发指定书目的许可,限制可通过线程数量。任意线程可消耗许可,也可释放许可,无需保证获取者释放许可。

Semaphore semaphore = new Semaphore(10);//创建大小为10的信号量

 semaphore.acquire();//获取许可,许可为0时阻塞

semaphore.release();//释放许可

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public class Main{public static void main(String[] args) throws InterruptedException {Main solution = new Main();Semaphore semaphore = new Semaphore(10);for(int i = 0; i < 50; i++){Thread t = new Thread(new A(semaphore,"number "+i));t.start();}Thread.sleep(8000);}
}class A implements Runnable{private Semaphore semaphore;private String name;public A(Semaphore semaphore,String name){this.semaphore = semaphore;this.name = name;}@Overridepublic void run() {try {semaphore.acquire();System.out.println(name+" is Running"+new Date().getTime()/1000);Thread.sleep(1000);semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}
}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

运行结果:

每秒有10条同时运行的结果

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

 14.10.2 倒计时门栓

线程集等待计数,直到计数变为0,一旦计数为0,不可重用。

CountDownLatch c = new CountDownLatch(10);//创建大小为10的倒计时门栓

C.countDown();//倒计时计数减1

C.await();//等待,直到倒计时为0

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public class Main{public static void main(String[] args) throws InterruptedException {Main solution = new Main();CountDownLatch c = new CountDownLatch(10);for(int i = 0; i < 10; i++){Thread t = new Thread(new A(c,"number "+i));t.start();Thread.sleep(1000);}}
}class A implements Runnable{private CountDownLatch c;private String name;public A(CountDownLatch c,String name){this.c = c;this.name = name;}@Overridepublic void run() {try {c.countDown();c.await();System.out.println(name+" is Running"+System.currentTimeMillis());Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

运行结果:

10个不同时启动的线程,可通过倒计时器同时开始执行

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

相关内容:选择 《Java核心技术 卷1》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!

更多推荐

笔记 第14章 多线程(12) 信号量Semaphore与倒计时门栓CountDownLatch

本文发布于:2024-02-27 22:14:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766476.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:信号量   多线程   倒计时   笔记   Semaphore

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!