java Semaphore
2016-04-11 09:37
399 查看
//Listing 6-4. Using a Counting Semaphore to Control Access to a Pool of Items import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Semaphore; public class A { public static void main(String[] args) { final Pool pool = new Pool(); Runnable r = new Runnable() { @Override public void run() { String name = Thread.currentThread().getName(); try { while (true) { String item; System.out.println(name + " acquiring " + (item = pool.getItem())); Thread.sleep(200 + (int) (Math.random() * 100)); System.out.println(name + " putting back " + item); pool.putItem(item); } } catch (InterruptedException ie) { System.out.println(name + "interrupted"); } } }; ExecutorService[] executors = new ExecutorService[Pool.MAX_AVAILABLE + 1]; for (int i = 0; i < executors.length; i++) { executors[i] = Executors.newSingleThreadExecutor(); executors[i].execute(r); } } } final class Pool { public static final int MAX_AVAILABLE = 10; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); private final String[] items; private final boolean[] used = new boolean[MAX_AVAILABLE]; Pool() { items = new String[MAX_AVAILABLE]; for (int i = 0; i < items.length; i++) items[i] = "I" + i; } String getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } void putItem(String item) { if (markAsUnused(item)) available.release(); } private synchronized String getNextAvailableItem() { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (!used[i]) { used[i] = true; return items[i]; } } return null; // not reached } private synchronized boolean markAsUnused(String item) { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]) { if (used[i]) { used[i] = false; return true; } else return false; } } return false; } }
相关文章推荐
- java反射机制工厂模式的应用
- Java swf 工作流
- 循序渐进之Spring AOP(3) - 配置代理
- java Mysql简单增删改查
- 【转帖】如何利用Spring Cloud构建起自我修复型分布式系统
- Java设计模式之工厂方法模式
- spring3的注解注入 的注意事项
- RMI--原理及实现浅析
- java 入门书籍(java7)
- Java集合Map接口与Map.Entry学习
- 线程实现JAVA编写时钟案例
- 关于Java的File.separator
- eclipse中进入真机模拟器中的数据库
- 浅谈Java方法的重载
- 利用pdf2swf将PDF转换成SWF
- JavaWeb学习总结(一)——JavaWeb开发入门
- 解释器与JIT编译器
- 详解Java中使用ImageIO类对图片进行压缩的方法
- java实现钱数数字到大写的转换联系
- 动态规划 和 图遍历的结合应用