Semaphore类是一个计数信号量,必须由获取它的线程释放。通常用于控制同时访问特定资源的线程数目。
可以将Semaphore理解成一个停车场,里面有指定数量的停车位。acquire就是申请占用一个停车位,release就是释放一个停车位。
package com.seasy.test; import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class SemaphoreTest { private static Semaphore semaphore; private static Random rnd = new Random(); public static void main(String[] args) { semaphore = new Semaphore(3); //初始化许可证数量 System.out.println(semaphore.availablePermits()); //当前可用的许可证数量 //System.out.println(semaphore.drainPermits()); //获得并返回剩余所有可用的许可证 System.out.println(semaphore.getQueueLength()); //获取当前Semaphore对象上正在等待许可证的线程数量 System.out.println(semaphore.hasQueuedThreads()); //判断当前Semaphore对象上是否存在正在等待许可证的线程 System.out.println(semaphore.isFair()); //是否公平模式FIFO for(int i=0; i<10; i++){ Thread thread = new Thread(new Runnable() { @Override public void run() { try{ //boolean b = semaphore.acquire(); //阻塞式获取一个许可,线程可中断 //semaphore.acquireUninterruptibly(); //阻塞式获取一个许可,线程不可中断 boolean b = semaphore.tryAcquire(); //非阻塞式获取一个许可 if(b){ int value = rnd.nextInt(2000); if(value < 100){ value = 100; } System.out.println(Thread.currentThread().getName() + ": " + value); TimeUnit.MILLISECONDS.sleep(value); semaphore.release(); //释放一个许可 System.out.println(Thread.currentThread().getName() + " ok"); } }catch(Exception ex){ ex.printStackTrace(); } } }); thread.start(); } System.out.println("ok"); } }
相关推荐
基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
主要介绍了Java并发编程Semaphore计数信号量详解,具有一定参考价值,需要的朋友可以了解下。
信号原子计数信号量,可以帮助您控制并发系统中多个进程对公共资源的访问。特征有效的无锁*语义提供RAII风格的获取/发布API 实现Send , Sync和Clone *不使用shutdown API时无锁定
从0.8.6版本开始,bordeaux-threads有其自己的内置信号量,因此您绝对应该使用它代替bt-semaphore。 安装 bt-semaphore可通过。 如果您好奇,还可以克隆Git存储库: cd ~/quicklisp/local-projects git clone ...
当在一个信号量上等待的线程解除堵塞时,内核自动会将信号量的计数减1。在.net 下通过Semaphore类来实现信号量同步。 Semaphore类限制可同时访问某一资源或资源池的线程数。WaitOne method, which is inherited from...
使用CMSIS API ,介绍FreeRTOS中计数信号量 b. 不使用CMSIS API,直接使用FreeRTOS函数 1. 简介 计数信号量可用于控制对资源的访问。要获得对资源的控制,任务必须首先获得信号量。因此减少了信号量计数值。当计...
信号量基本上用于将任务与系统中的其他事件同步。在FreeRTOS中,信号量是基于队列机制实现的。FreeRTOS中有4种信号量: ...- 计数信号量 - 互斥信号量 - 递归信号量 本文介绍: 二进制信号量的使用方法
黑窗口 多线程 不断输出数据 按键盘暂停继续,很实用。VC6.0.对于初学信号量的人来说很有用。
信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。信号量的值仅能由 PV 操作来改变。 在 Linux 下,PV 操作...
引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................
引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析..........................