Java tutorial
/* * Copyright 2008-2010 the T2 Project ant the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //package org.t2framework.commons.util; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; public class Pool<T> { private static int DEFAULT_POOL_MAX = 10; private List<T> stock; private Set<T> havings; public static <T> Pool<T> create(T... stocks) { return new Pool<T>(Arrays.asList(stocks)); } public static <T extends Cloneable> Pool<T> create(T origin) { return create(origin, DEFAULT_POOL_MAX); } public static <T extends Cloneable> Pool<T> create(T origin, int poolMax) { if (origin == null) { throw new IllegalArgumentException("origin: " + origin); } if (poolMax < 1) { throw new IllegalArgumentException("poolMax: " + poolMax); } List<T> copies = new ArrayList<T>(); for (int i = 0; i < poolMax; i++) { try { @SuppressWarnings("unchecked") T copied = (T) origin.getClass().getMethod("clone").invoke(origin); copies.add(copied); } catch (Exception e) { throw new IllegalStateException(e); } } return new Pool<T>(copies); } private Pool(List<T> stocks) { if (stocks == null || stocks.size() == 0) { throw new IllegalArgumentException("stocks: " + stocks); } this.stock = new CopyOnWriteArrayList<T>(); this.havings = new CopyOnWriteArraySet<T>(); for (T stockItem : stocks) { stock.add(stockItem); havings.add(stockItem); } } public T borrowItem() { try { while (true) { if (0 < stock.size()) { return stock.remove(0); } Thread.sleep(10); } } catch (InterruptedException e) { throw new IllegalStateException(e); } } public void returnItem(T item) { if (havings.contains(item) == false) { throw new IllegalStateException("item is not mine"); } stock.add(item); } }