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的 ...
随机推荐
- C语言 · 三角形
算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长 ...
- java日期工具类DateUtil-续一
上篇文章中,我为大家分享了下DateUtil第一版源码,但就如同文章中所说,我发现了还存在不完善的地方,所以我又做了优化和扩展. 更新日志: 1.修正当字符串日期风格为MM-dd或yyyy-MM时,若 ...
- Lua中的loadfile、dofile、require详解
1.loadfile——只编译,不运行 loadfile故名思议,它只会加载文件,编译代码,不会运行文件里的代码.比如,我们有一个hellofile.lua文件: 复制代码代码如下: print(“h ...
- oracle 字符集 AL32UTF8、UTF8
简介:ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,ORA ...
- 【Hibernate步步为营】--核心对象+持久对象全析(二)
上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...
- mybatis 一对多关系
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- pymongo创建索引、更新、删除
pymongo创建索引.更新.删除 索引创建 ## collection 为数据集合collection.create_Index({'需创建索引字段': 1})collection.ensu ...
- 可供前端工程师选择的精彩CSS框架
在这里你有一个很酷的框架,收集创建的CSS布局. 如果你不喜欢框架,宁愿使用自己的手写代码以促进自己的发展,请跳过本篇文章. 我想有一个建设性的意见,那就是有选择的使用其优点避开其缺点. 就个人而言, ...
- IE和Firefox之间的JavaScript差异
这篇文章中,我会略述一下 Internet Explorer 和 Firefox 在 JavaScript 语法上不同的几 个方面. 1. CSS “float” 属性 获取给定对象的特定 CSS 属 ...
- 基本上每个应用程序领域的程序员都有使用 C++
C++ 的使用基本上每个应用程序领域的程序员都有使用 C++. C++ 通常用于编写设备驱动程序和其他要求实时性的直接操作硬件的软件. C++ 广泛用于教学和研究. 任何一个使用苹果电脑或 Windo ...