Java多线程之Semaphore
来源:互联网 发布:知轻重明得失的意思 编辑:程序博客网 时间:2024/04/30 08:25
Java多线程之Semaphore
分类: [JAVA] [JAVA]--[并发编程]2011-12-21 09:49 4395人阅读 评论(0) 收藏 举报
semaphore多线程javastringclassservice
- import java.util.ArrayList;
- 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;
- /**
- * Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是:
- * Semaphore, CountDownLatch, CyclicBarrier和Exchanger.
- * 本例主要介绍Semaphore。
- * Semaphore是用来管理一个资源池的工具,可以看成是个通行证,
- * 线程要想从资源池拿到资源必须先拿到通行证,
- * 如果线程暂时拿不到通行证,线程就会被阻断进入等待状态。
- */
- public class SemaphoreTest {
- /**
- * 模拟资源池的类
- * 只为池发放2个通行证,即同时只允许2个线程获得池中的资源。
- */
- public static class Pool {
- // 保存资源池中的资源
- ArrayList<String> pool = null;
- // 通行证
- Semaphore pass = null;
- Lock lock = new ReentrantLock();
- public Pool(int size) {
- // 初始化资源池
- pool = new ArrayList<String>();
- for (int i = 0; i < size; i++) {
- pool.add("Resource " + i);
- }
- // 发放2个通行证
- pass = new Semaphore(2);
- }
- public String get() throws InterruptedException {
- // 获取通行证,只有得到通行证后才能得到资源
- System.out.println("Try to get a pass...");
- pass.acquire();
- System.out.println("Got a pass");
- return getResource();
- }
- public void put(String resource) {
- // 归还通行证,并归还资源
- System.out.println("Released a pass");
- pass.release();
- releaseResource(resource);
- }
- private String getResource() {
- lock.lock();
- String result = pool.remove(0);
- System.out.println("资源 " + result + " 被取走");
- lock.unlock();
- return result;
- }
- private void releaseResource(String resource) {
- lock.lock();
- System.out.println("资源 " + resource + " 被归还");
- pool.add(resource);
- lock.unlock();
- }
- }
- public static void testPool() {
- // 准备10个资源的资源池
- final Pool aPool = new Pool(10);
- Runnable worker = new Runnable() {
- public void run() {
- String resource = null;
- try {
- //取得resource
- resource = aPool.get();
- //用resource做工作
- System.out.println("I am working on " + resource);
- Thread.sleep(500);
- System.out.println("I finished on " + resource);
- } catch (InterruptedException ex) {
- }
- //归还resource
- aPool.put(resource);
- }
- };
- // 启动5个任务
- ExecutorService service = Executors.newCachedThreadPool();
- for (int i = 0; i < 5; i++) {
- service.submit(worker);
- }
- service.shutdown();
- }
- public static void main(String[] args) {
- SemaphoreTest.testPool();
- }
- }
0 0
- Java多线程之Semaphore
- JAVA多线程之Semaphore
- Java多线程之Semaphore
- Java多线程之Semaphore
- Java多线程之信号量Semaphore
- Java 多线程之信号量 Semaphore
- (八)java多线程之Semaphore
- java多线程之Semaphore信号量详解
- java多线程同步工具之Semaphore信号灯
- 我之见--java多线程信号量Semaphore
- java多线程之Semaphore类基本用法
- java多线程之Semaphore信号量详解
- java 多线程之Semaphore互斥类的用法
- Java基础:多线程之ReadWriteLock、Condition、Semaphore
- java多线程之Semaphore信号量详解
- Java多线程工具之Semaphore(信号量)
- java多线程之Semaphore信号量详解
- JAVA多线程之——Semaphore
- 动态规划经典五题
- 【LeetCode】Palindrome Partitioning II 解题报告
- CIKM2014参会印象
- java计算总奖金用Swing工具-源码(可扩展功能的)
- Tuxedo与Weblogic互连指南(2)--Weblogic部分
- Java多线程之Semaphore
- 1002. A+B for Polynomials (25)
- 僵尸进程的产生原因
- 配置jdk环境
- 一个睡五分钟等于六个钟头的方法
- HDU 2012 素数判定(素数)
- Java Map遍历方式的选择
- 嵌入式第二天:第一个程序Hello,World
- UVA 11270 Tiling Dominoes 初学插头DP