java高级---->Thread之Semaphore的使用
Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。今天我们就学习一下Semaphore的用法。
java中多线程Semaphore的使用
关于Semaphore常用的方法的介绍
// 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
acquire():Acquires a permit from this semaphore, blocking until one is available, or the thread is interrupted.
// 释放一个许可,将其返回给信号量。
release() :Releases a permit, returning it to the semaphore.
一、Semaphore的简单使用
public class SemaphoreTest {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
final Semaphore availableWindow = new Semaphore(5);
int count = 1;
@Override
public void run() {
int time = (int) (Math.random() * 10 + 3);
int num = count++;
try {
availableWindow.acquire();
System.out.println("正在为第【" + num + "】个客户办理业务,需要时间:" + time + "s!");
Thread.sleep(time * 1000);
if (availableWindow.hasQueuedThreads()) {
System.out.println("第【" + num + "】个客户已办理完业务,有请下一位!");
} else {
System.out.println("第【" + num + "】个客户已办理完业务,没有客户了,休息中!");
}
availableWindow.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}; // 循环10次
for (int i = 1; i < 10; i++) {
new Thread(runnable).start();
}
}
}
运行的结果如下:每次运行的结果是不一样的
正在为第【】个客户办理业务,需要时间:3s!
正在为第【】个客户办理业务,需要时间:12s!
正在为第【】个客户办理业务,需要时间:10s!
正在为第【】个客户办理业务,需要时间:7s!
正在为第【】个客户办理业务,需要时间:3s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:11s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:6s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:10s!
第【】个客户已办理完业务,有请下一位!
正在为第【】个客户办理业务,需要时间:12s!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
第【】个客户已办理完业务,没有客户了,休息中!
二、Semaphore可以当成mutual exclusion lock使用
A semaphore initialized to one, and which is used such that it only has at most one permit available, can serve as a mutual exclusion lock.
package com.linux.huhx.concurreny; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class SemaphoreTest1 {
public static void main(String[] args) {
final BusinessTask task = new BusinessTask();
ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
service.execute(task);
}
service.shutdown();
} private static class BusinessTask implements Runnable {
private int count;
Lock lock = new ReentrantLock();
Semaphore semaphore = new Semaphore(1); @Override
public void run() {
try {
// semaphore.acquire();
lock.lock();
count ++;
Thread.sleep(1000);
System.out.println(count);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// semaphore.release();
lock.unlock();
}
}
}
}
运行的结果固定如下:
友情链接
java高级---->Thread之Semaphore的使用的更多相关文章
- java高级之信号灯Semaphore
1.Semaphore概念 Semaphore是Java1.5之后提供的一种同步工具,Semaphore可以维护访问自身线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数 ...
- java高级---->Thread之ScheduledExecutorService的使用
ScheduledExecutorService的主要作用就是可以将定时任务与线程池功能结合使用.今天我们来学习一下ScheduledExecutorService的用法.我们都太渺小了,那么容易便湮 ...
- java高级---->Thread之ExecutorService的使用
今天我们通过实例来学习一下ExecutorService的用法.我徒然学会了抗拒热闹,却还来不及透悟真正的冷清. ExecutorService的简单实例 一.ExecutorService的简单使用 ...
- java高级---->Thread之Phaser的使用
Phaser提供了动态增parties计数,这点比CyclicBarrier类操作parties更加方便.它是jdk1.7新增的类,今天我们就来学习一下它的用法.尘埃落定之后,回忆别来挑拨. Phas ...
- java高级---->Thread之CompletionService的使用
CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...
- java高级---->Thread之CyclicBarrier的使用
CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).今天我们就学习一下CyclicBarrier的用法. Cycl ...
- java高级---->Thread之BlockingQueue的使用
今天我们通过实例来学习一下BlockingQueue的用法.梦想,可以天花乱坠,理想,是我们一步一个脚印踩出来的坎坷道路. BlockingQueue的实例 官方文档上的对于BlockingQueue ...
- java高级---->Thread之Exchanger的使用
Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...
- java高级---->Thread之FutureTask的使用
FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行.今天我们通过实例来学习一下FutureTask的 ...
随机推荐
- Spring的作用域以及RequestContextListener作用<转>
一.配置方式 在Spring2.0中除了以前的Singleton和Prototype外又加入了三个新的web作用域,分别为request.session和global session,如果你想让你的容 ...
- JAVA里使用CKEditor和CKFinder的配置
在JSP里使用CKEditor和CKFinder的配置 CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. “预览”中有一大堆鸟语,看 ...
- Node.js连接postgres
一.下载Node.js postgres驱动 Node.js里面没有postgres模块的,我们需要安装node-postgres模块. node-postgres模块的下载地址为:https://g ...
- glob 遍历函数
例子 1 <?php print_r(glob("*.txt")); ?> 输出类似: Array ( [0] => target.txt [1] => s ...
- selenium测试(Java)--下载文件(十六)
下载文件需要在Firefox 的profile属性中配置一些参数,如下面的代码: package com.test.download; import java.io.File; import org. ...
- android 编译 app
有些编写的app需要放到android的源码中进行编译.放置的路径packages/apps/ 编译方法,参考 http://blog.csdn.net/luoshengyang/article/de ...
- 64位程序,long*转long 出错
原因: long*在64位程序中占8个字节,long占4个字节.强转会出错. 解决方法: 把long用long long替换,long long 占8个字节
- linux下使用tar命令 (转至http://www.cnblogs.com/li-hao/archive/2011/10/03/2198480.html)
解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: c 创建新的档案文件.如果用户想备份一个目录或 ...
- 1077. Kuchiguse (20)【字符串处理】——PAT (Advanced Level) Practise
题目信息 1077. Kuchiguse (20) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The Japanese language is notorious f ...
- 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...