JAVA-Semaphore信号灯-可实现维护自身线程访问数
2016-01-08 15:28
567 查看
import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * Semaphore 信号灯 * * Semaphore通常用于限制可以访问的某一个资源(物理或逻辑)的线程数目,例如实现对文件并发量的访问控制 * 每一个行动在acquire获得一个许可,release放开一个许可 * * 构造方法 * new Semaphore(4) 四个许可 * new Semaphore(4,ture/false) 后面的参数确定抢占许可的策略是否是公平的,默认是false,先来先得 * * 其他应用 * 单个的信号灯可实现线程互斥锁功能,优点是一个线程获得了“锁”,在由另外一个线程释放锁 * 可使用于死锁恢复的一些场合 * * @author * */ public class SemaphoreTest { public static void main(String[] args) { final Semaphore semaphore = new Semaphore(3); ExecutorService service = Executors.newCachedThreadPool(); // 可变的线程池大小 for (int i = 0; i < 10; i++) { Runnable runnable = new Runnable() { @Override public void run() { try { semaphore.acquire(); // 拿走一个许可 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + "拿走 一个许可, 当前还剩"+(3-semaphore.availablePermits())+"个并发"); try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread().getName() + ",即将退出"); semaphore.release(); // 换回 System.out.println("线程" + Thread.currentThread().getName() + ",退出,当前剩余"+(3-semaphore.availablePermits())+"个并发"); } }; service.execute(runnable); } service.shutdown(); } }
相关文章推荐
- 成为JAVA GC专家系列
- Struts + Spring + Hibernate 进阶开端(一)
- thrift 基于window的安装配置
- 2.java成长之路——重读java编程思想02
- 【java基础】JSTL标签库的使用
- Java开发环境--JDK配置
- Java 中long型转换成年月日时间
- struts2文件上传限制大小问题
- Spring定时任务+时间配置(附资源下载)
- 基础回顾之java Date获取年月日时分秒
- Java身份证验证方法
- JAVA 中 静态方法,非静态方法,构造方法 ,执行顺序
- Java 线程同步
- Eclipse Java注释模板设置详解
- 从头认识java-17.2 基本的线程机制(2)-Executors的使用
- SpringMvc 开发配置流程
- Struts2的零配置和REST插件
- Java中判断字符串是否为数字的五种方法
- eclipse插件教程-弹出界面框
- struts2 package name作用