没有合适的资源?快使用搜索试试~ 我知道了~
首页Java并发编程:CountDownLatch、CyclicBarrier与Semaphore详解及实战示例
Java并发编程:CountDownLatch、CyclicBarrier与Semaphore详解及实战示例
1 下载量 46 浏览量
更新于2024-09-01
收藏 88KB PDF 举报
"本文档详细介绍了Java并发编程中的三个重要工具:CountDownLatch、CyclicBarrier和Semaphore。CountDownLatch是一个计数器类,用于控制多个线程的同步执行,允许主线程等待其他线程完成特定数量的操作。它的核心构造函数接受一个整数参数,表示需要计数到零的线程数量。主要的方法包括`await()`(使线程暂停直到计数为零)和`countDown()`(减少计数)。通过一个简单的测试类示例,展示了如何使用CountDownLatch确保两个线程按照预期顺序执行。 CyclicBarrier则是一个更复杂的同步工具,它在所有参与的线程到达并调用`await()`方法后才会继续执行。每个线程都有自己的屏障点,当所有线程都到达这个点后,它们会被阻塞直到其他线程也达到。与CountDownLatch不同,CyclicBarrier的计数是固定的,循环使用。 Semaphore是一种信号量,用于控制同时访问某个资源的线程数量。它有两个关键方法:`acquire()`(获取许可,如果当前许可数量大于0,则增加一个许可)和`release()`(释放一个许可)。Semaphore可以根据需要设置许可的最大数量,控制并发访问的数量。 在实际应用中,开发者可以根据具体场景选择合适的并发控制工具。例如,CountDownLatch适用于单次操作完成后等待所有线程结束,CyclicBarrier适用于同步多线程执行的特定阶段,而Semaphore则适合于控制资源的并发访问。理解并灵活运用这些工具,有助于编写高效、健壮的并发程序。"
资源详情
资源推荐
Java并发编程:并发编程:CountDownLatch与与CyclicBarrier和和Semaphore的实例详解的实例详解
主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下
Java并发编程:并发编程:CountDownLatch与与CyclicBarrier和和Semaphore的实例详解的实例详解
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个
辅助类的用法。
以下是本文目录大纲:
一一.CountDownLatch用法用法
二二.CyclicBarrier用法用法
三三.Semaphore用法用法
若有不正之处请多多谅解,并欢迎批评指正。
一一.CountDownLatch用法用法
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此
时就可以利用CountDownLatch来实现这种功能了。
CountDownLatch类只提供了一个构造器:
public CountDownLatch(int count) { }; //参数count为计数值
然后下面这3个方法是CountDownLatch类中最重要的方法:
public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { }; //将count值减1
下面看一个例子大家就清楚CountDownLatch的用法了:
public class Test {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
new Thread(){
public void run() {
try {
System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
Thread.sleep(3000);
System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
new Thread(){
public void run() {
try {
System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");
Thread.sleep(3000);
System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
try {
System.out.println("等待2个子线程执行完毕...");
latch.await();
System.out.println("2个子线程已经执行完毕");
System.out.println("继续执行主线程");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果:
线程Thread-0正在执行
线程Thread-1正在执行
等待2个子线程执行完毕...
线程Thread-0执行完毕
线程Thread-1执行完毕
2个子线程已经执行完毕
继续执行主线程
二二.CyclicBarrier用法用法
字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被
重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。
CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器:
public CyclicBarrier(int parties, Runnable barrierAction) {
}
下载后可阅读完整内容,剩余4页未读,立即下载
weixin_38653155
- 粉丝: 6
- 资源: 987
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功