Thinking in Java学习笔记 Semaphore控制的资源池
来源:互联网 发布:mac迅雷好用吗 编辑:程序博客网 时间:2024/06/05 19:03
SemaphoreDemo.java
一个资源池Pool,可以由多个线程检出和检入其中的资源,由Semaphore控制同步问题,由数组来记录每个资源的检出/检入状态
CheckoutTask这个线程,启动多个,负责检入检出资源。
资源类Fat,有比较复杂的计算
同时在main()方法中对资源进行了检出和检入操作
package com.test.concurrent;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class SemaphoreDemo {static final int SIZE=25;public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubfinal Pool<Fat> pool=new Pool(SIZE,Fat.class);ExecutorService exec=Executors.newCachedThreadPool();for(int i=0;i<SIZE;i++){exec.execute(new CheckoutTask(pool));}System.out.println("All checkoutTask created!!!");List<Fat> list=new ArrayList<Fat>();for(int i=0;i<SIZE;i++){Fat f=pool.checkOut();System.out.println(i+" : main() thread check out");f.operation();list.add(f);}Future<?> blocked=exec.submit(new Runnable(){public void run(){try {pool.checkOut();} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println("Checkout Interrupted!!!!!!!!!!!!");e.printStackTrace();}}});TimeUnit.SECONDS.sleep(2);blocked.cancel(true);System.out.println("-------------Checking in objects in "+list);for(int i=0;i<SIZE;i++){Fat item=list.get(i);pool.checkIn(item);}for(Fat f:list){pool.checkIn(f);exec.shutdown();}}}class Pool<T>{private int size;private Semaphore available;private volatile boolean checkOut[];private List<T> items=new ArrayList<T>();public Pool(int size, Class<T> objectClass){this.size=size;available=new Semaphore(size,true);checkOut=new boolean[size];for(int i=0;i<size;i++){try {items.add(objectClass.newInstance());} catch (InstantiationException | IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public T checkOut() throws InterruptedException{available.acquire();return getItem();}public void checkIn(T t){if(releaseItem(t))available.release();}private synchronized T getItem(){for(int i=0;i<size;i++){if(!checkOut[i]){checkOut[i]=true;return (T)items.get(i);}}return null;}private synchronized boolean releaseItem(T item){int index=items.indexOf(item);if(index<0){return false;}if(checkOut[index]){checkOut[index]=false;return true;}return false;}}class Fat{private volatile double d; //prevent optimizationprivate static int counter=0;private final int id=counter++;public Fat(){for(int i=0;i<10000;i++){d+=(Math.PI+Math.E);}}public String toString(){return "Fat id: "+id+" D:"+d;}public void operation(){System.out.println(this);}}class CheckoutTask<T> implements Runnable{private static int counter=0;private final int id=counter++;Pool<T> pool;public CheckoutTask(Pool<T> pool){this.pool=pool;}@Overridepublic void run(){try {T item=pool.checkOut();System.out.println(this+" check out "+item);TimeUnit.SECONDS.sleep(1);System.out.println(this+" check in "+item);pool.checkIn(item);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public String toString(){return "CheckoutTask id:"+id+" ";}}
输出为:
All checkoutTask created!!!
0 : main() thread check out
CheckoutTask id:9 check out Fat id: 9 D:58598.74482048422
CheckoutTask id:4 check out Fat id: 4 D:58598.74482048422
CheckoutTask id:23 check out Fat id: 24 D:58598.74482048422
CheckoutTask id:19 check out Fat id: 17 D:58598.74482048422
CheckoutTask id:0 check out Fat id: 0 D:58598.74482048422
CheckoutTask id:16 check out Fat id: 16 D:58598.74482048422
CheckoutTask id:20 check out Fat id: 18 D:58598.74482048422
CheckoutTask id:6 check out Fat id: 6 D:58598.74482048422
CheckoutTask id:11 check out Fat id: 11 D:58598.74482048422
CheckoutTask id:8 check out Fat id: 8 D:58598.74482048422
CheckoutTask id:7 check out Fat id: 7 D:58598.74482048422
CheckoutTask id:10 check out Fat id: 10 D:58598.74482048422
CheckoutTask id:21 check out Fat id: 22 D:58598.74482048422
CheckoutTask id:22 check out Fat id: 19 D:58598.74482048422
CheckoutTask id:17 check out Fat id: 21 D:58598.74482048422
CheckoutTask id:1 check out Fat id: 1 D:58598.74482048422
CheckoutTask id:12 check out Fat id: 15 D:58598.74482048422
CheckoutTask id:18 check out Fat id: 20 D:58598.74482048422
CheckoutTask id:13 check out Fat id: 12 D:58598.74482048422
CheckoutTask id:2 check out Fat id: 2 D:58598.74482048422
CheckoutTask id:14 check out Fat id: 13 D:58598.74482048422
CheckoutTask id:15 check out Fat id: 14 D:58598.74482048422
Fat id: 23 D:58598.74482048422
CheckoutTask id:3 check out Fat id: 3 D:58598.74482048422
CheckoutTask id:5 check out Fat id: 5 D:58598.74482048422
CheckoutTask id:9 check in Fat id: 9 D:58598.74482048422
CheckoutTask id:20 check in Fat id: 18 D:58598.74482048422
CheckoutTask id:16 check in Fat id: 16 D:58598.74482048422
CheckoutTask id:0 check in Fat id: 0 D:58598.74482048422
1 : main() thread check out
Fat id: 16 D:58598.74482048422
2 : main() thread check out
Fat id: 0 D:58598.74482048422
3 : main() thread check out
Fat id: 18 D:58598.74482048422
CheckoutTask id:4 check in Fat id: 4 D:58598.74482048422
CheckoutTask id:23 check in Fat id: 24 D:58598.74482048422
4 : main() thread check out
Fat id: 4 D:58598.74482048422
5 : main() thread check out
Fat id: 24 D:58598.74482048422
CheckoutTask id:12 check in Fat id: 15 D:58598.74482048422
CheckoutTask id:8 check in Fat id: 8 D:58598.74482048422
6 : main() thread check out
Fat id: 15 D:58598.74482048422
7 : main() thread check out
Fat id: 8 D:58598.74482048422
CheckoutTask id:19 check in Fat id: 17 D:58598.74482048422
CheckoutTask id:24 check out Fat id: 9 D:58598.74482048422
8 : main() thread check out
Fat id: 17 D:58598.74482048422
CheckoutTask id:17 check in Fat id: 21 D:58598.74482048422
9 : main() thread check out
Fat id: 21 D:58598.74482048422
CheckoutTask id:14 check in Fat id: 13 D:58598.74482048422
10 : main() thread check out
Fat id: 13 D:58598.74482048422
CheckoutTask id:11 check in Fat id: 11 D:58598.74482048422
11 : main() thread check out
Fat id: 11 D:58598.74482048422
CheckoutTask id:6 check in Fat id: 6 D:58598.74482048422
12 : main() thread check out
Fat id: 6 D:58598.74482048422
CheckoutTask id:5 check in Fat id: 5 D:58598.74482048422
13 : main() thread check out
Fat id: 5 D:58598.74482048422
CheckoutTask id:7 check in Fat id: 7 D:58598.74482048422
14 : main() thread check out
Fat id: 7 D:58598.74482048422
CheckoutTask id:10 check in Fat id: 10 D:58598.74482048422
15 : main() thread check out
Fat id: 10 D:58598.74482048422
CheckoutTask id:21 check in Fat id: 22 D:58598.74482048422
16 : main() thread check out
Fat id: 22 D:58598.74482048422
CheckoutTask id:22 check in Fat id: 19 D:58598.74482048422
17 : main() thread check out
Fat id: 19 D:58598.74482048422
CheckoutTask id:1 check in Fat id: 1 D:58598.74482048422
18 : main() thread check out
Fat id: 1 D:58598.74482048422
CheckoutTask id:18 check in Fat id: 20 D:58598.74482048422
19 : main() thread check out
Fat id: 20 D:58598.74482048422
CheckoutTask id:13 check in Fat id: 12 D:58598.74482048422
20 : main() thread check out
Fat id: 12 D:58598.74482048422
CheckoutTask id:2 check in Fat id: 2 D:58598.74482048422
21 : main() thread check out
Fat id: 2 D:58598.74482048422
CheckoutTask id:15 check in Fat id: 14 D:58598.74482048422
22 : main() thread check out
Fat id: 14 D:58598.74482048422
CheckoutTask id:3 check in Fat id: 3 D:58598.74482048422
23 : main() thread check out
Fat id: 3 D:58598.74482048422
CheckoutTask id:24 check in Fat id: 9 D:58598.74482048422
24 : main() thread check out
Fat id: 9 D:58598.74482048422
Checkout Interrupted!!!!!!!!!!!!
-------------Checking in objects in [Fat id: 23 D:58598.74482048422, Fat id: 16 D:58598.74482048422, Fat id: 0 D:58598.74482048422, Fat id: 18 D:58598.74482048422, Fat id: 4 D:58598.74482048422, Fat id: 24 D:58598.74482048422, Fat id: 15 D:58598.74482048422, Fat id: 8 D:58598.74482048422, Fat id: 17 D:58598.74482048422, Fat id: 21 D:58598.74482048422, Fat id: 13 D:58598.74482048422, Fat id: 11 D:58598.74482048422, Fat id: 6 D:58598.74482048422, Fat id: 5 D:58598.74482048422, Fat id: 7 D:58598.74482048422, Fat id: 10 D:58598.74482048422, Fat id: 22 D:58598.74482048422, Fat id: 19 D:58598.74482048422, Fat id: 1 D:58598.74482048422, Fat id: 20 D:58598.74482048422, Fat id: 12 D:58598.74482048422, Fat id: 2 D:58598.74482048422, Fat id: 14 D:58598.74482048422, Fat id: 3 D:58598.74482048422, Fat id: 9 D:58598.74482048422]
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
at java.util.concurrent.Semaphore.acquire(Unknown Source)
at com.test.concurrent.Pool.checkOut(SemaphoreDemo.java:73)
at com.test.concurrent.SemaphoreDemo$1.run(SemaphoreDemo.java:31)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
- Thinking in Java学习笔记 Semaphore控制的资源池
- Thinking in Java学习笔记,使用Exchanger交换资源
- 【thinking in java】学习笔记 三 初始化及权限控制
- Thinking in Java学习笔记,可以被Future.cancel()中断的资源
- 《Thinking in Java》狗血的学习笔记-2表达式与控制流程
- Thinking In Java学习笔记
- Thinking in Java学习笔记
- thinking in java 学习笔记
- 《Thinking in java》学习笔记
- Thinking in Java学习笔记
- Thinking In Java学习笔记
- Thinking in java 笔记----权限访问控制
- java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6
- 我的Thinking in Java 3rd 的学习笔记
- java学习笔记1-thinking in java
- java学习笔记2-thinking in java
- java学习笔记3-thinking in java
- 我的Thinking in Java学习笔记(1)
- Hibernate SQL查询 addScalar()或addEntity()
- 欢迎使用CSDN-markdown编辑器
- 循环-04. 验证“哥德巴赫猜想”(20)
- 已赱濄那庅誃舂萩,該甪什庅莱漈奠這埘
- 支付接口被阻拦,支付宝提示ILLEGAL_EXTERFACE
- Thinking in Java学习笔记 Semaphore控制的资源池
- 三角形顺时针和逆时针的判定
- 年轻人必学!保持生活斗志的20种经典方法
- 【操作系统】[Windows]:WIN8 / WIN8.1 的程序员计算器(包括进制之间的转换)
- 深入Log4J源码之Log4J Core
- 银行储蓄系统...
- NandFlash详述
- java后台读取服务器上的图片!
- CodeForces 197B Limit