java多线程----Semaphore信号量
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- public class SemaphoreTest1 {
- private static final int SEM_MAX = 10;
- public static void main(String[] args) {
- Semaphore sem = new Semaphore(SEM_MAX);
- //创建线程池
- ExecutorService threadPool = Executors.newFixedThreadPool(3);
- //在线程池中执行任务
- threadPool.execute(new MyThread(sem, 5));
- threadPool.execute(new MyThread(sem, 4));
- threadPool.execute(new MyThread(sem, 7));
- //关闭池
- threadPool.shutdown();
- }
- }
- class MyThread extends Thread {
- private volatile Semaphore sem; // 信号量
- private int count; // 申请信号量的大小
- MyThread(Semaphore sem, int count) {
- this.sem = sem;
- this.count = count;
- }
- public void run() {
- try {
- // 从信号量中获取count个许可
- sem.acquire(count);
- Thread.sleep(2000);
- System.out.println(Thread.currentThread().getName() + " acquire count="+count);
- } catch (InterruptedException e) {
- e.printStackTrace();
- } finally {
- // 释放给定数目的许可,将其返回到信号量。
- sem.release(count);
- System.out.println(Thread.currentThread().getName() + " release " + count + "");
- }
- }
- }
- pool-1-thread-1 acquire count=5
- pool-1-thread-2 acquire count=4
- pool-1-thread-1 release 5
- pool-1-thread-2 release 4
- pool-1-thread-3 acquire count=7
- pool-1-thread-3 release 7
- 结果说明:信号量sem的许可总数是10个;共3个线程,分别需要获取的信号量许可数是5,4,7。前面两个线程获取到信号量的许可后,sem中剩余的可用的许可数是1;因此,最后一个线程必须等前两个线程释放了它们所持有的信号量许可之后,才能获取到7个信号量许可。
- Semaphore是一个计数信号量,它的本质是一个"共享锁"。
- 信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
java多线程----Semaphore信号量的更多相关文章
- java多线程-Semaphore信号量使用
介绍 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 概念 Semaphore分为单值和多值两种,前者 ...
- Java多线程系列——信号量:Semaphore
简介 信号量为多线程协作提供了更为强大的控制方法.也可以说,信号量是对锁的扩展.无论是内部锁 synchronized 还是重入锁 ReentrantLock,一次都只允许一个线程访问一个资源,而信号 ...
- Java多线程——Semaphore信号灯
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允许的并发访问数. Sem ...
- Java多线程的信号量
Java的信号量主要的作用是控制线程对资源的访问例如我一个线程池里面有100个线程等待执行,但是我允许最多同时运行5个线程,这5个线程只有其中一个线程执行完毕后,在线程池中等待的线程才能进入开始执行, ...
- Java中Semaphore(信号量)的使用
Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...
- [.net 多线程]Semaphore信号量
信号量(Semaphore)是一种CLR中的内核同步对象.与标准的排他锁对象(Monitor,Mutex,SpinLock)不同的是,它不是一个排他的锁对象,它与SemaphoreSlim,Reade ...
- Java中Semaphore(信号量) 数据库连接池
计数信号量用来控制同时访问某个特定资源的操作数或同时执行某个指定操作的数量 A counting semaphore.Conceptually, a semaphore maintains a set ...
- Java多线程_Semaphore信号量
概念: Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.当Semaphore的个数变成1时,即代表只允许 ...
- Java Concurrency - Semaphore 信号量
Semaphore 是一个控制访问多个共享资源的计数器. 当一个线程想要访问某个共享资源,首先,它必须获得 semaphore.如果 semaphore 的内部计数器的值大于 0,那么 semapho ...
随机推荐
- zoj 2676 Network Wars 0-1分数规划+最小割
题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用 题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最 ...
- EasyUI常用控件禁用方法
EasyUI常用控件禁用方法: 1.validatebox可以用的用法:前两种适用于单个的validatebox; 第三种应用于整个form里面的输入框; <1>.$("#id& ...
- ZOJ 3948 - Marjar Cola
让我回想起了小学的时候,空瓶换饮料还能向别人借一个空瓶喝了再还回去的神奇问题…… 开始时思考,特判一下a=1或者b=1的情况为INF就可以了,然后发现2 2 1 2这样的样例也是能够喝到无穷多瓶饮料的 ...
- Oracle Function:TO_CHAR
Description The Oracle/PLSQL TO_CHAR function converts a number or date to a string.将数字转换为日期或字符串 Syn ...
- UESTC - 1057 秋实大哥与花 线段树模板题
http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...
- oozie学习笔记
#################################################################################################### ...
- OKEx货币对价格数量长度及精度
长度 precisions = [["bch_btc","0.001","0.00000001"], ["ltc_btc" ...
- centos7设置iptables
https://www.linuxidc.com/Linux/2017-10/147238.htm
- 如果要写php扩展啥的, 要看什么?
1.写PHP扩展并不难 有一定C语言基础即可.切记一定要在Linux平台下开发,不要用Windows 这里有一篇博文,可以看下http://rango.swoole.com/archives/152 ...
- 常用社交网络(微博等)动态新闻(feed、新鲜事)系统浅析(转)
add by zhj:同时也看看国外牛逼公司是怎么做的吧 Stream-Framework Python实现的feed Twitter 2013 Redis based, database fa ...