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));
	print("All CheckoutTasks created");
	List<Fat> list = new ArrayList<Fat>();
	for (int i = 0; i < SIZE; i++) {
	    Fat f = pool.checkOut();
	    printnb(i + ": main() thread checked out ");
	    f.operation();
	    list.add(f);
	}
	Future<?> blocked = exec.submit(new Runnable() {
	    public void run() {
		try {
		    // Semaphore prevents additional checkout,
		    // so call is blocked:
		    pool.checkOut();
		} catch (InterruptedException e) {
		    print("checkOut() Interrupted");
		}
	    }
	});
	TimeUnit.SECONDS.sleep(2);
	blocked.cancel(true); // Break out of blocked call
	print("Checking in objects in " + list);
	for (Fat f : list)
	    pool.checkIn(f);
	for (Fat f : list)
	    pool.checkIn(f); // Second checkIn ignored
	exec.shutdown();
    }