001    /**
002     * Copyright (C) 2011-2012 Barchart, Inc. <http://www.barchart.com/>
003     *
004     * All rights reserved. Licensed under the OSI BSD License.
005     *
006     * http://www.opensource.org/licenses/bsd-license.php
007     */
008    package com.barchart.util.concurrent;
009    
010    import java.util.concurrent.BlockingQueue;
011    import java.util.concurrent.Callable;
012    import java.util.concurrent.ThreadPoolExecutor;
013    import java.util.concurrent.TimeUnit;
014    
015    /**
016     * <p>
017     * Executes tasks in a thread pool. submit() method return a FutureCallback
018     * instance, to allow easily attaching notification callbacks to jobs.
019     * </p>
020     * 
021     * @author jeremy
022     */
023    public class FutureCallbackExecutor extends ThreadPoolExecutor {
024    
025            public FutureCallbackExecutor(final int poolSize, final int maxPoolSize,
026                            final long keepAlive, final TimeUnit units,
027                            final BlockingQueue<Runnable> queue) {
028                    super(poolSize, maxPoolSize, keepAlive, units, queue);
029            }
030    
031            @Override
032            protected <T> FutureCallbackTask<T> newTaskFor(final Callable<T> callable) {
033                    return new FutureCallbackTask<T>(callable);
034            }
035    
036            @Override
037            protected <T> FutureCallbackTask<T> newTaskFor(final Runnable runnable,
038                            final T value) {
039                    return new FutureCallbackTask<T>(runnable, value);
040            }
041    
042            @Override
043            public <T> FutureCallbackTask<T> submit(final Callable<T> callable) {
044                    final FutureCallbackTask<T> f = newTaskFor(callable);
045                    execute(f);
046                    return f;
047            }
048    
049            @Override
050            public <T> FutureCallbackTask<T> submit(final Runnable runnable,
051                            final T value) {
052                    final FutureCallbackTask<T> f = newTaskFor(runnable, value);
053                    execute(f);
054                    return f;
055            }
056    
057            @Override
058            public FutureCallbackTask<?> submit(final Runnable runnable) {
059                    final FutureCallbackTask<?> f = newTaskFor(runnable, null);
060                    execute(f);
061                    return f;
062            }
063    
064    }