Created
July 19, 2016 08:50
-
-
Save hn5092/d8609b97ab432f09bcce5ef3a44c2687 to your computer and use it in GitHub Desktop.
how to use futuretask
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class ExecutorCompletionService<V> implements CompletionService<V> { | |
private final Executor executor; | |
private final AbstractExecutorService aes; | |
private final BlockingQueue<Future<V>> completionQueue; | |
/** | |
* FutureTask extension to enqueue upon completion | |
*/ | |
private class QueueingFuture extends FutureTask<Void> { | |
QueueingFuture(RunnableFuture<V> task) { | |
super(task, null); | |
this.task = task; | |
} | |
protected void done() { completionQueue.add(task); } | |
private final Future<V> task; | |
} | |
private RunnableFuture<V> newTaskFor(Callable<V> task) { | |
if (aes == null) | |
return new FutureTask<V>(task); | |
else | |
return aes.newTaskFor(task); | |
} | |
private RunnableFuture<V> newTaskFor(Runnable task, V result) { | |
if (aes == null) | |
return new FutureTask<V>(task, result); | |
else | |
return aes.newTaskFor(task, result); | |
} | |
/** | |
* Creates an ExecutorCompletionService using the supplied | |
* executor for base task execution and a | |
* {@link LinkedBlockingQueue} as a completion queue. | |
* | |
* @param executor the executor to use | |
* @throws NullPointerException if executor is {@code null} | |
*/ | |
public ExecutorCompletionService(Executor executor) { | |
if (executor == null) | |
throw new NullPointerException(); | |
this.executor = executor; | |
this.aes = (executor instanceof AbstractExecutorService) ? | |
(AbstractExecutorService) executor : null; | |
this.completionQueue = new LinkedBlockingQueue<Future<V>>(); | |
} | |
/** | |
* Creates an ExecutorCompletionService using the supplied | |
* executor for base task execution and the supplied queue as its | |
* completion queue. | |
* | |
* @param executor the executor to use | |
* @param completionQueue the queue to use as the completion queue | |
* normally one dedicated for use by this service. This | |
* queue is treated as unbounded -- failed attempted | |
* {@code Queue.add} operations for completed tasks cause | |
* them not to be retrievable. | |
* @throws NullPointerException if executor or completionQueue are {@code null} | |
*/ | |
public ExecutorCompletionService(Executor executor, | |
BlockingQueue<Future<V>> completionQueue) { | |
if (executor == null || completionQueue == null) | |
throw new NullPointerException(); | |
this.executor = executor; | |
this.aes = (executor instanceof AbstractExecutorService) ? | |
(AbstractExecutorService) executor : null; | |
this.completionQueue = completionQueue; | |
} | |
public Future<V> submit(Callable<V> task) { | |
if (task == null) throw new NullPointerException(); | |
RunnableFuture<V> f = newTaskFor(task); | |
executor.execute(new QueueingFuture(f)); | |
return f; | |
} | |
public Future<V> submit(Runnable task, V result) { | |
if (task == null) throw new NullPointerException(); | |
RunnableFuture<V> f = newTaskFor(task, result); | |
executor.execute(new QueueingFuture(f)); | |
return f; | |
} | |
public Future<V> take() throws InterruptedException { | |
return completionQueue.take(); | |
} | |
public Future<V> poll() { | |
return completionQueue.poll(); | |
} | |
public Future<V> poll(long timeout, TimeUnit unit) | |
throws InterruptedException { | |
return completionQueue.poll(timeout, unit); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment