1. 程式人生 > >簡易對象池

簡易對象池

port ner second can ble 構建 creat executor ole

簡易的對象池,需要深入了解的話,得閱讀<<Thinking in Pattern>>

import java.util.*;
import java.util.concurrent.*;

/**
 * 對象池
 * @author Administrator
 *
 * @param <T>
 */
class Pool<T>{
	private int size;
	private List<T> items = new ArrayList<T>();
	private volatile boolean[] isCheckedOut;
	Semaphore signalControl;
	public Pool(int size,Class<T> classObject) {
		signalControl = new Semaphore(size,true);
		this.size = size;
		isCheckedOut = new boolean[size];
		for(int i=0;i<size;i++) {
			try {
				items.add(classObject.getDeclaredConstructor().newInstance());
			}catch (Exception e) {
				throw new RuntimeException(e);
			}
		}
	}
	public void checkIn(T x) {
		if(releaseItem(x)) {
			signalControl.release();
		}
	}
	public T checkOut() throws InterruptedException {
		signalControl.acquire();
		return getItem();		
	}
	public synchronized T getItem() {
		for(int i=0;i<size;i++) {
			if(!isCheckedOut[i]) {
				isCheckedOut[i] = true;
				return items.get(i);
			}
		}
		return null;
	}
	public synchronized boolean releaseItem(T item) {
		int index = items.indexOf(item);
		if(index == -1)
			return false;
		if(isCheckedOut[index]) {
			isCheckedOut[index] = false;
			return true;
		}
		return false;
	}
}

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);
		}
	}
	public void operation() {
		System.out.println(this);
	}
	public String toString() {
		return "Fat id: " + id;
	}
}

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("Check out " + item);
			TimeUnit.SECONDS.sleep(1);
			System.out.println("Check in " + item);
			pool.checkIn(item);
		}catch (InterruptedException e) {
			
		}
	}
	public String toString() {
		return "CheckTase " + id + " ";
	}
}

public class Restaurant{
	final static int SIZE = 25;
	public static void main(String[] args) throws Exception {
		//創建一個對象池
		final Pool<Fat> fatPool = new Pool<Fat>(SIZE, Fat.class);
		ExecutorService executorService = Executors.newCachedThreadPool();
		for(int i=0;i<SIZE;i++) {
			executorService.execute(new CheckoutTask<Fat>(fatPool));
		}
		System.out.println("All CheckoutTask created");
		List<Fat> list = new ArrayList<>();
		for(int i=0;i<SIZE;i++) {
			Fat fat = fatPool.checkOut();
			System.out.println(i + ": main() thread check out");
			fat.operation();
			list.add(fat);
		}
		Future<?> blocked = executorService.submit(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				try {
					System.out.println("Is leave out?");
					fatPool.checkOut();
				}catch (Exception e) {
					System.out.println("NO");
				}
			}
		});
		
		TimeUnit.SECONDS.sleep(2);
		blocked.cancel(true);
		for(Fat fat:list) {
			fatPool.checkIn(fat);
		}
		for(Fat fat:list) {
			fatPool.checkIn(fat);
		}
		executorService.shutdown();
	}
}

  

簡易對象池