java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6

来源:互联网 发布:空燃比传感器数据 编辑:程序博客网 时间:2024/05/20 17:07

package org.rui.thread.newc.semaphore;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Semaphore;/** * 允许N个任务同时访问这个资源 * @author lenovo * * @param <T> */public class Pool<T>{private int size;private List<T> items = new ArrayList<T>();private volatile boolean[] checkedOut;private Semaphore available;public Pool(Class<T> classObject, int size){this.size = size;checkedOut = new boolean[size];available = new Semaphore(size, true);// load pool with objects that can be checked out:可以检查的对象的负载池for (int i = 0; i < size; i++){// assumes a default constructor自己的默认构造函数try{//Object o=classObject.newInstance();//Fat f=(Fat) classObject.newInstance();items.add(classObject.newInstance());} catch (Exception e){throw new RuntimeException(e);}}}//如果你需要一个新对象,那么你可以调用checkOut(),在使用完后递交给checkIn()public T checkOut() throws InterruptedException{//如果没有任何的Semaphore许何证,意味着池中没有对象可用了available.acquire();//获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。return getItems();}public void checkIn(T x){if (releaseItem(x))//如果被签入的对象有效,则会向信号亮返回一个许可证available.release();//释放一个许可,将其返回给信号量。}private synchronized T getItems(){for (int i = 0; i < size; ++i){//System.out.println(checkedOut[i]);if (!checkedOut[i])//如果为false  说明是releaseItem 则可以签出{checkedOut[i] = true;//System.out.println("xxxxxx===="+items.get(i));return items.get(i);}}return null;// semaphore prevents reaching here防止信号到达这里}private synchronized boolean releaseItem(T item){int index = items.indexOf(item);if (index == -1)return false;// not in the listif (checkedOut[index])//如果为true 则说明已签出 则可以释放{//System.out.println("releaseItem:"+item);checkedOut[index] = false;return true;}return false;// wasn't checked out 没有签出}}

package org.rui.thread.newc.semaphore;public class Fat{private volatile double d;private static int counter = 0;private final int id = counter++;public Fat(){// expensive, interruptible operation:for (int i = 1; i < 10000; i++){d += (Math.PI + Math.E) / (double) i;}}public void operation(){System.out.println("operation>>  "+this);}@Overridepublic String toString(){return "Fat>>id:" + id;}}

<pre name="code" class="java">package org.rui.thread.newc.semaphore;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.TimeUnit;class CheckoutTask<T> implements Runnable{private static int counter = 0;private final int id = counter++;private int index;private Pool<T> pool;public CheckoutTask(Pool<T> pool, int size){this.pool = pool;this.index = size;}@Overridepublic void run(){try{T item = pool.checkOut();System.out.println(this + "checked out 已签出:" + item);TimeUnit.SECONDS.sleep(1);System.out.println("checked in 释放:" + item);pool.checkIn(item);// 将用完的对像释放// System.out.println(index+"  counter="+counter+"  id=="+id);// if(index==counter-1){// TimeUnit.SECONDS.sleep(1);// System.out.println("=======all checkoutTasks created");//// }} catch (InterruptedException e){System.out.println(e.getMessage());// TODO Auto-generated catch block// e.printStackTrace();}}@Overridepublic String toString(){return "checkoutTask " + id + " ";}}// //////////////////////////public class SemaphoreDemo{final static int Size = 25;public static void main(String[] args) throws InterruptedException{final Pool<Fat> pool = new Pool<Fat>(Fat.class, Size);ExecutorService exec = Executors.newCachedThreadPool();// 开始操练poolfor (int i = 0; i < Size; i++){exec.execute(new CheckoutTask<Fat>(pool, i));}System.out.println("all checkoutTasks created");// main 开始签出pool中的Fat对象 -1,但并不签入他们。// 一但池中的所有的对象都被签出后,semaphore将不在执行任何签出操作,List<Fat> list = new ArrayList<Fat>();for (int i = 0; i < Size; i++){try{Fat f = pool.checkOut();System.out.println(i + "   >>main() thrad checked out 签出");f.operation();list.add(f);} catch (InterruptedException e){e.printStackTrace();}}// 无对象可签出 run 会阻塞Future<?> blocked = exec.submit(new Runnable(){@Overridepublic void run(){try{// semaphore prevents additional checkout 信号量防止额外的校验// so call is blocked 因此调用被阻塞pool.checkOut();} catch (InterruptedException e){System.err.print("checkOut() interrupted");// e.printStackTrace();}}});// 持有一段时间后再将它们签入TimeUnit.SECONDS.sleep(2);// 以此来挣脱future,取消,冗余的签入将被pool忽略System.out.println("任务是否完成:"+blocked.isDone());blocked.cancel(true);// break out of blocked call 中断呼叫中断 试图取消对此任务的执行System.out.println();/////////////////都签入之后 再可以继续使用poolfor (Fat f : list){pool.checkIn(f);}//这里其实可以再次使用pool了,for (Fat f : list){pool.checkIn(f);// second checkin ignored 二签忽略}// exec.shutdown();}}/** * output: * checkoutTask 0 checked out 已签出:Fat>>id:0checkoutTask 2 checked out 已签出:Fat>>id:2checkoutTask 1 checked out 已签出:Fat>>id:1checkoutTask 4 checked out 已签出:Fat>>id:3checkoutTask 3 checked out 已签出:Fat>>id:4checkoutTask 5 checked out 已签出:Fat>>id:5checkoutTask 6 checked out 已签出:Fat>>id:6checkoutTask 7 checked out 已签出:Fat>>id:7checkoutTask 8 checked out 已签出:Fat>>id:8checkoutTask 9 checked out 已签出:Fat>>id:9checkoutTask 10 checked out 已签出:Fat>>id:10checkoutTask 11 checked out 已签出:Fat>>id:11checkoutTask 12 checked out 已签出:Fat>>id:12checkoutTask 13 checked out 已签出:Fat>>id:13checkoutTask 14 checked out 已签出:Fat>>id:14checkoutTask 15 checked out 已签出:Fat>>id:15checkoutTask 16 checked out 已签出:Fat>>id:16checkoutTask 18 checked out 已签出:Fat>>id:18checkoutTask 17 checked out 已签出:Fat>>id:17checkoutTask 19 checked out 已签出:Fat>>id:19checkoutTask 20 checked out 已签出:Fat>>id:20checkoutTask 21 checked out 已签出:Fat>>id:21checkoutTask 22 checked out 已签出:Fat>>id:22checkoutTask 23 checked out 已签出:Fat>>id:23all checkoutTasks created0   >>main() thrad checked out 签出operation>>  Fat>>id:24checked in 释放:Fat>>id:1checkoutTask 24 checked out 已签出:Fat>>id:1checked in 释放:Fat>>id:21   >>main() thrad checked out 签出operation>>  Fat>>id:2checked in 释放:Fat>>id:02   >>main() thrad checked out 签出operation>>  Fat>>id:0checked in 释放:Fat>>id:33   >>main() thrad checked out 签出operation>>  Fat>>id:3checked in 释放:Fat>>id:44   >>main() thrad checked out 签出operation>>  Fat>>id:4checked in 释放:Fat>>id:55   >>main() thrad checked out 签出operation>>  Fat>>id:5checked in 释放:Fat>>id:76   >>main() thrad checked out 签出operation>>  Fat>>id:7checked in 释放:Fat>>id:97   >>main() thrad checked out 签出operation>>  Fat>>id:9checked in 释放:Fat>>id:118   >>main() thrad checked out 签出operation>>  Fat>>id:11checked in 释放:Fat>>id:139   >>main() thrad checked out 签出operation>>  Fat>>id:13checked in 释放:Fat>>id:1510   >>main() thrad checked out 签出operation>>  Fat>>id:15checked in 释放:Fat>>id:1711   >>main() thrad checked out 签出operation>>  Fat>>id:17checked in 释放:Fat>>id:2112   >>main() thrad checked out 签出operation>>  Fat>>id:21checked in 释放:Fat>>id:1913   >>main() thrad checked out 签出operation>>  Fat>>id:19checked in 释放:Fat>>id:2314   >>main() thrad checked out 签出operation>>  Fat>>id:23checked in 释放:Fat>>id:8checked in 释放:Fat>>id:615   >>main() thrad checked out 签出operation>>  Fat>>id:616   >>main() thrad checked out 签出operation>>  Fat>>id:8checked in 释放:Fat>>id:1017   >>main() thrad checked out 签出checked in 释放:Fat>>id:14checked in 释放:Fat>>id:16checked in 释放:Fat>>id:18checked in 释放:Fat>>id:20checked in 释放:Fat>>id:22checked in 释放:Fat>>id:12operation>>  Fat>>id:1018   >>main() thrad checked out 签出operation>>  Fat>>id:1219   >>main() thrad checked out 签出operation>>  Fat>>id:1420   >>main() thrad checked out 签出operation>>  Fat>>id:1621   >>main() thrad checked out 签出operation>>  Fat>>id:1822   >>main() thrad checked out 签出operation>>  Fat>>id:2023   >>main() thrad checked out 签出operation>>  Fat>>id:22checked in 释放:Fat>>id:124   >>main() thrad checked out 签出operation>>  Fat>>id:1任务是否完成:falsecheckOut() interrupted*/




1 0
原创粉丝点击