java5的Semaphere同步工具(十四)
来源:互联网 发布:医药政策法规数据库 编辑:程序博客网 时间:2024/06/01 15:06
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。
Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。
另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。
关于从这里开始的各个同步工具例子的代码,现场编写的效果还不如拷贝代码到eclipse中进行解释的效果直观和简洁,这样能一下子把全局和整体展现在学员面前。然后再可以带着大家一行行地去写,这样可以起到巩固原理和锻炼大家编写代码能力和启发思考的效果。
public class SemaphoreTest {
publicstatic void main(String[] args) {
ExecutorServiceservice = Executors.newCachedThreadPool();
final Semaphore sp = new Semaphore(3);
for(inti=0;i<10;i++){
Runnablerunnable = new Runnable(){
publicvoid run(){
try{
sp.acquire();
}catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("线程" +Thread.currentThread().getName() +
"进入,当前已有" +(3-sp.availablePermits()) + "个并发");
try{
Thread.sleep((long)(Math.random()*10000));
}catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" +Thread.currentThread().getName() +
"即将离开");
sp.release();
//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
System.out.println("线程" +Thread.currentThread().getName() +
"已离开,当前已有" +(3-sp.availablePermits()) + "个并发");
}
};
service.execute(runnable);
}
}
}
- java5的Semaphere同步工具(十四)
- (11)java5的Semaphere、CyclicBarrier同步工具
- (11)java5的Semaphere、CyclicBarrier同步工具
- 【Java多线程与并发库】12.java5的Semaphere同步工具
- Java5新增的同步工具
- Java5的CyclicBarrier同步工具
- java5的CyclicBarrier同步工具(十五)
- java5的CountDownLatch同步工具(十六)
- java5的Exchanger同步工具(十七)
- java5的Semaphore同步工具简单实例
- Java5的Exchanger同步工具简单实例
- java5 CountDownLatch同步工具
- 黑马程序员——Java基础---线程的另一个总结(8)--Semaphere同步工具,控制线程可用线程
- (12)java5的CountDownLatch、Exchanger同步工具
- (12)java5的CountDownLatch、Exchanger同步工具
- java5中为多线程提供的同步工具类
- Java5 多线程(五)--CyclicBarrier同步的工具类
- Java5 多线程(五)--CyclicBarrier同步的工具类
- Android中的自动朗读(TTS)
- 云开发环境 IDE
- 二分第二弹
- 【转载】serialVersionUID有什么作用
- lvs keepalived
- java5的Semaphere同步工具(十四)
- 棕着住纵佐桌祖遵注装准仔纵诅作拙撞鬃
- stm32---iic通信
- Activiti学习(一)
- [Leetcode]Palindrome Number
- html_checkbox示例
- 使用函数对象代替函数作算法的 参数
- linux环境下的hive mysql hadoop环境搭建
- mongodb monk limit 分页