Semaphore :一种可以控制访问资源的数量、或者控制同时同一操作的数量。
Semaphore构造器:
public Semaphore(int permits) 需要传入一个正整数,此数量即为控制访问的资源数量。
public Semaphore(int permits, boolean fair) 创建一个是否是公平的信号量。当fair=true
时,线程将会按到达的顺序(FIFO)执行。
下面是Semaphore的方法.
acquire() | 获取一个许可.当获取后对许可集减去1 |
acquire(int permits) | 获取permits个许可,当获取后对许可集减去permits |
release() | 释放一个许可 |
release(int permits) | 释放permits个许可 |
acquireUninterruptibly() | 一个不可中断的获取一个许可 |
acquireUninterruptibly(int permits) | 一个不可中断的获取permits个许可 |
tryAcquire() | 试图获取一个许可。如果获取到返回true,否则返回false |
tryAcquire(int permits) | 试图获取permits个许可。如果获取到返回true,否则返回false |
tryAcquire(long timeout, TimeUnit unit) | 单位时间内,试图获取一个许可。如果获取到返回true,否则返回false |
tryAcquire(int permits, long timeout, TimeUnit unit) | 单位时间内,试图获取permits个许可。如果获取到返回true,否则返回false |
|
下面举例说下用法:
1.控制访问数量
package com.asiainfo.concurrent;
import java.util.concurrent.Semaphore;
/**
* Semaphore 是控制资源的访问数量、或者同时执行同一操作的数量.
*
* 假设我们现在手上只有5台电脑,有10个人想上网。因此只能等有的人不上网了,其他人才有机会上网
* @author fansh
*
*/
public class SemaphoreTest {
/**
* 特定的资源 ---------只有5台电脑
*/
private static Semaphore semaphore = new Semaphore(5);
public static void main(String[] args) {
SemaphoreTest test = new SemaphoreTest();
for(int i=0;i<10;i++){
Person person = test.new Person(i+"");
person.start();
}
}
class Person extends Thread{
private String name;
public Person(String name){
this.name=name;
}
public void run() {
try {
semaphore.acquire();
System.out.println(this.name+"正在上网中.....");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println(this.name+"不上网中.....");
semaphore.release();
}
}
}
}
2.使无界队列变为有界队列
package com.asiainfo.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
/**
* Semaphore
*
* 使无界队列变为有界队列
* @author fansh
*
*/
public class SemaphoreTest1<T> {
private final Semaphore semaphore;
private final List<T> list = new ArrayList<T>();
public SemaphoreTest1(int bound){
semaphore= new Semaphore(bound);
}
public void add(T t){
try {
semaphore.acquire();
list.add(t);
} catch (InterruptedException e) {
semaphore.release();
}
}
public void remove(T t){
boolean flag=list.remove(t);
if(flag){
semaphore.release();
}
}
}
3. 获取许可被中断 和不可中断的用法
package com.asiainfo.concurrent;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;
/**
* Semaphore
* 模拟acquire阻塞时候被中断
* acquire 抛出InterruptedException 因此是可中断的
* acquireUninterruptibly 不可中断
*
* @author fansh
*
*/
public class SemaphoreTest2<T> {
private final Semaphore semaphore;
private final List<T> list = new ArrayList<T>();
public SemaphoreTest2(int bound){
semaphore= new Semaphore(bound);
}
public void add(T t){
// try {
// semaphore.acquire();
// list.add(t);
// } catch (InterruptedException e) {
// System.out.println("添加动作被中断了...........");
// semaphore.release();
// }
// 不可中断测试.....
semaphore.acquireUninterruptibly();
list.add(t);
}
public void remove(T t){
boolean flag=list.remove(t);
if(flag){
semaphore.release();
}
}
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
Future future=service.submit(new Runnable() {
@Override
public void run() {
SemaphoreTest2 test2 =new SemaphoreTest2(2);
test2.add("a");
test2.add("b");
test2.add("c");
}
});
service.shutdown();
/**
* 等待添加动作充分完成
*/
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
future.cancel(true);
}
}
分享到:
相关推荐
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
代码清晰的展示了生产者与消费者模式,以及Java中semaphore信号量的使用方法
主要介绍了Java并发编程Semaphore计数信号量详解,具有一定参考价值,需要的朋友可以了解下。
Semaphore Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场
主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
JAVA多线程--信号量(Semaphore)_.docx
主要介绍了Java并发编程之Semaphore(信号量)详解及实例的相关资料,需要的朋友可以参考下
主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下
Java 信号量编程实践
信号 信号量是一个非常简单的Android应用程序,可以在屏幕上显示信号量。 只是一个信号量,仅此而已。 您可以点击屏幕上的,并且指示灯会顺序切换。
Semaphore 中文称信号量,它和ReentrantLock 有所区别,ReentrantLock是排他的,也就是只能允许一个线程拥有资源,Semaphore是共享的,它允许多个线程同时拥有资源,是AQS中共享模式的实现,在前面的AQS分析文章中,...
Java并发编程(23)并发新特性—信号量Semaphore(含代码)编程开发技术共3页.pdf.zip
使用Java Spring的信号量演示CI / CD管道示例Spring Boot应用程序和CI / CD管道显示了如何在上运行Java项目。应用概述产品特点简单的登录屏幕用户注册通过Basic身份验证层保护的端点用于在数据库中存储用户的持久层...
15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock 21. 读写锁 ...
java线程源码带有信号量和线程的Dinning哲学家问题。 信号量是整数变量,用于通过使用两个原子操作(用于过程同步的wait和signal)来解决关键部分问题。 等待和信号的定义如下: Wait-等待操作减小其参数s的值(如果...