Java 线程工具类 加法/减法/信号量
参考
- 狂神说
- JDK11文档
描述(JDK文档内容)
-
CountDownLatch
减法计数器:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。(通过countDow()
方法进行减少计数,当计数为0时await
处会被唤醒)- 构造方法 :
CountDownLatch(int count)
构造一个用给定计数初始化的CountDownLatch
countDown()
:减少锁存器的计数,如果计数达到零则释放所有等待的线程await()
:导致当前线程等到锁存器倒计数到零,除非线程是 interrupted
- 构造方法 :
-
CyclicBarrier
加法计数器:一种同步辅助工具,允许一组线程全部等待彼此到达公共障碍点。(通过await()
方法进行增加计数,当计数为partie
s 时执行barrierAction
代码。)CyclicBarrier(int parties, Runnable barrierAction)
:创建一个新的CyclicBarrier
,当给定数量的参与方(线程)等待它时将跳闸,并且当屏障被触发时执行给定的屏障操作,由进入屏障的最后一个线程执行。(有两个构造方法,第一个构造方法可以不传入Runnable/Lambda
,而不执行指定操作 )await()
:等待所有parties
在此障碍上调用await
。reset()
:将屏障重置为其初始状态。
-
Semaphore
信号量:计数信号量。 从概念上讲,信号量保持一组许可。 如果有必要,每个acquire()
都会阻止,直到有许可证,然后接受。 每个release()
都添加了许可证,可能会释放阻止收购者。 但是,没有使用实际的许可对象;Semaphore
只保留可用数量并相应地采取行动。(通过acquire
获取一个执行许可,当执行许可被授权完毕之后,后面还需要获取授权的线程会堵塞并等待;当线程执行完毕后,通过release
归还许可。)Semaphore(int permits)
:使用给定数量的许可和非公平公平设置创建Semaphore
。(第二个构造方法需要传入一个参数来设置 是否公平锁,默认不传入是非公平锁)acquire()
:从此信号量获取许可,阻止直到一个可用,或者线程为 interrupted 。release()
:发布许可证,将其返回到信号量。
代码(狂神说代码)
CountDownLatch
减法计数器
package thread;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* @Author 夏秋初
* @Date 2022/3/1 15:36
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
// 减法计数器,初始化参数为设置计数次数
CountDownLatch countDownLatch = new CountDownLatch(10);
//
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"执行完毕");
// 计数减一
countDownLatch.countDown();
}, String.valueOf(i)).start();
}
// 计数器清零前不会结束
countDownLatch.await();
System.out.println("程序加载完毕");
}
}
CyclicBarrier
加法计数器
package thread;
import java.util.*;
import java.util.concurrent.*;
/**
* @Author 夏秋初
* @Date 2022/3/1 15:36
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
// 加法计数器
CyclicBarrier cyclicBarrier = new CyclicBarrier(10, ()->{
System.out.println("程序执行完毕");
});
//
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"执行完毕");
// 计数加一
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
}
}
Semaphore
信号量
package thread;
import java.util.*;
import java.util.concurrent.*;
/**
* @Author 夏秋初
* @Date 2022/3/1 15:36
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
// 限流
Semaphore semaphore = new Semaphore(2);
//
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
}
博 主 :夏秋初
地 址 :https://www.cnblogs.com/xiaqiuchu/p/15951059.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
地 址 :https://www.cnblogs.com/xiaqiuchu/p/15951059.html
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
标签:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义