Java并发-类库新组件 - Semaphore 理解:计数信号量
来源:互联网 发布:simulink怎么增加端口 编辑:程序博客网 时间:2024/05/18 01:18
Pool.java 类
package com.xyw.concurrent.blog;import java.util.*;import java.util.concurrent.*;/* * 对象池概念.管理和回收对象,可以签出和签入对象的概念 */public class Pool<T> {private int size;private List<T> items = new ArrayList<T>();private volatile boolean[] checkedOut;private Semaphore available; // 计数信号量 允许n个任务同时访问这个资源public Pool(Class<T> classObject, int size){this.size = size;checkedOut = new boolean[size]; // 用来表示某个任务是否被签出的情况available = new Semaphore(size, true);for(int i = 0; i < size; ++i){try{items.add(classObject.newInstance()); // 现在向其中添加对象}catch(Exception e){throw new RuntimeException(e);}}}public T checkOut() throws InterruptedException{available.acquire();return getItem(); // 对象签出对象池,这个是重新获得一个可用的对象从对象池中获得}public void checkIn(T x){if(releaseItem(x)){available.release(); // 对象签入对象池,用于回收对象池// 而 semaphore 的真正起到的作用 ,只是 利用并发,进行技术信号量}}private synchronized T getItem(){for(int i =0; i< size; ++i){if(!checkedOut[i]){checkedOut[i] = true;return items.get(i); }}return null;}private synchronized boolean releaseItem(T item){int index = items.indexOf(item);if (index == -1) return false;if (checkedOut[index]){checkedOut[index] = false;return true;}return false; // 这个表示,没有被签出的情况} }
Fat.java 类
package com.xyw.concurrent.blog;public class Fat {private volatile double d;private static int counter = 0;private final int id = counter++;public Fat(){for(int i = 1; i < 10000; i++){d += (Math.PI + Math.E) / (double) i;}}public void operation(){System.out.println(this);}public String toString(){return "Fat id:" + id;}} // 这是个创建代价高昂的对象类型,其构造器运行起来很是费事
SemaphoreDemo.java
package com.xyw.concurrent.blog;import java.util.*;import java.util.concurrent.*;class CheckoutTask<T> implements Runnable{private static int counter = 0;private final int id = counter++;private Pool<T> pool;public CheckoutTask(Pool<T> pool){this.pool = pool; // 创建的对象池,用于回收线程和产生线程}public void run(){try{T item = pool.checkOut(); // 签出一个线程System.out.println(this +"checked out" + item); // 产生出一个线程TimeUnit.SECONDS.sleep(1); // 产生一个对象,并运行一段时间System.out.println(this + "checking in " + item);pool.checkIn(item); // 回收对象,到对象池里面}catch(InterruptedException e){}}public String toString(){return "CheckedOutTask" + id + " ";}}public class SemaphoreDemo {final static int SIZE = 25;public static void main(String[] args) throws Exception{final Pool<Fat> pool = new Pool<Fat>(Fat.class,SIZE); // 创建对象池对象ExecutorService exec = Executors.newCachedThreadPool();for(int i = 0; i < SIZE; i++){exec.execute(new CheckoutTask<Fat>(pool));}System.out.println("All CheckoutTasks created");List<Fat> list = new ArrayList<Fat>();for(int i = 0; i< SIZE; i++){Fat f = pool.checkOut();System.out.println(i + " main() thread checked out");f.operation();list.add(f);}Future<?> blocked = exec.submit(new Runnable(){public void run(){try{pool.checkOut();}catch(InterruptedException e){System.out.println("checkOut() Interrupted"); }}}); // 一旦池中对象都被签出,Semaphore 将不再允许执行任何签出操作 block 的方法被Pool忽略。TimeUnit.SECONDS.sleep(2);blocked.cancel(true);System.out.println("checking in objects in" + list);for(Fat f : list)pool.checkIn(f);for(Fat f: list)pool.checkIn(f);exec.shutdown();}}
运行结果:
CheckedOutTask0 checked outFat id:0
CheckedOutTask2 checked outFat id:2
CheckedOutTask1 checked outFat id:1
CheckedOutTask3 checked outFat id:3
CheckedOutTask4 checked outFat id:4
CheckedOutTask5 checked outFat id:5
CheckedOutTask6 checked outFat id:6
CheckedOutTask7 checked outFat id:7
CheckedOutTask8 checked outFat id:8
CheckedOutTask9 checked outFat id:9
CheckedOutTask10 checked outFat id:10
CheckedOutTask11 checked outFat id:11
CheckedOutTask12 checked outFat id:12
CheckedOutTask13 checked outFat id:13
CheckedOutTask14 checked outFat id:14
CheckedOutTask15 checked outFat id:15
CheckedOutTask16 checked outFat id:16
CheckedOutTask17 checked outFat id:17
CheckedOutTask18 checked outFat id:18
CheckedOutTask19 checked outFat id:19
CheckedOutTask20 checked outFat id:20
CheckedOutTask21 checked outFat id:21
CheckedOutTask22 checked outFat id:22
All CheckoutTasks created
CheckedOutTask23 checked outFat id:23
0 main() thread checked out
Fat id:24
CheckedOutTask2 checking in Fat id:2
CheckedOutTask5 checking in Fat id:5
CheckedOutTask24 checked outFat id:2
CheckedOutTask4 checking in Fat id:4
CheckedOutTask7 checking in Fat id:7
CheckedOutTask3 checking in Fat id:3
CheckedOutTask1 checking in Fat id:1
CheckedOutTask0 checking in Fat id:0
CheckedOutTask9 checking in Fat id:9
CheckedOutTask8 checking in Fat id:8
1 main() thread checked out
Fat id:5
CheckedOutTask11 checking in Fat id:11
CheckedOutTask6 checking in Fat id:6
2 main() thread checked out
Fat id:0
CheckedOutTask10 checking in Fat id:10
3 main() thread checked out
CheckedOutTask13 checking in Fat id:13
CheckedOutTask12 checking in Fat id:12
CheckedOutTask14 checking in Fat id:14
Fat id:1
4 main() thread checked out
Fat id:3
5 main() thread checked out
Fat id:4
6 main() thread checked out
Fat id:6
7 main() thread checked out
Fat id:7
8 main() thread checked out
Fat id:8
CheckedOutTask15 checking in Fat id:15
CheckedOutTask16 checking in Fat id:16
CheckedOutTask21 checking in Fat id:21
CheckedOutTask20 checking in Fat id:20
CheckedOutTask19 checking in Fat id:19
CheckedOutTask22 checking in Fat id:22
CheckedOutTask18 checking in Fat id:18
CheckedOutTask17 checking in Fat id:17
9 main() thread checked out
CheckedOutTask23 checking in Fat id:23
Fat id:9
10 main() thread checked out
Fat id:10
11 main() thread checked out
Fat id:11
12 main() thread checked out
Fat id:12
13 main() thread checked out
Fat id:13
14 main() thread checked out
Fat id:14
15 main() thread checked out
Fat id:15
16 main() thread checked out
Fat id:16
17 main() thread checked out
Fat id:17
18 main() thread checked out
Fat id:18
19 main() thread checked out
Fat id:19
20 main() thread checked out
Fat id:20
21 main() thread checked out
Fat id:21
22 main() thread checked out
Fat id:22
23 main() thread checked out
Fat id:23
CheckedOutTask24 checking in Fat id:2
24 main() thread checked out
Fat id:2
checkOut() Interrupted
checking in objects in[Fat id:24, Fat id:5, Fat id:0, Fat id:1, Fat id:3, Fat id:4, Fat id:6, Fat id:7, Fat id:8, Fat id:9, Fat id:10, Fat id:11, Fat id:12, Fat id:13, Fat id:14, Fat id:15, Fat id:16, Fat id:17, Fat id:18, Fat id:19, Fat id:20, Fat id:21, Fat id:22, Fat id:23, Fat id:2]
- Java并发-类库新组件 - Semaphore 理解:计数信号量
- java并发之Semaphore(计数信号量)
- JAVA 计数信号量SEMAPHORE
- java Semaphore 计数信号量
- 并发编程--Semaphore计数信号量
- Java并发编程实战--计数信号量(Semaphore)
- JAVA并发信号量 Semaphore
- java并发信号量Semaphore
- java并发之Semaphore(信号量)
- java 并发工具包 -信号量 Semaphore
- 理解JAVA的Semaphore信号量
- java中的计数信号量(Counting Semaphore)
- Java多线程/并发22、信号量Semaphore
- Java并发包之Semaphore信号量
- 并发中的信号量Semaphore
- Semaphore信号灯:一个计数信号量
- 计数信号量Semaphore的使用
- Semaphore(信号量)理解
- 常用网站
- <? extends SomeClass>与<T extends SomeClass>的区别
- @property
- Opencv--视频操作基础
- Fragment 不响应onActivityResult
- Java并发-类库新组件 - Semaphore 理解:计数信号量
- effective4 条款二 慎用预编译器#define
- 程序员的干货:20条传说中的犯贱心理学(单身狗的福利)
- iOS 隐私政策url
- Android RelativeLayout属性
- 文献笔记:《Fitting a 3D Morphable Model to Edges: A Comparison Between Hard and Soft Correspondences》读后感~
- MySQL的性能优化
- RxJava 转换操作符scan
- IDT