| /* |
| * Copyright (C) 2008 Google Inc. |
| * |
| * 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 com.google.common.util.concurrent; |
| |
| import java.util.concurrent.Callable; |
| import java.util.concurrent.Executor; |
| import java.util.concurrent.FutureTask; |
| |
| /** |
| * A {@link FutureTask} that also implements the {@link ListenableFuture} |
| * interface. Subclasses must make sure to call {@code super.done()} if they |
| * also override the {@link #done()} method, otherwise the listeners will not |
| * be called. |
| * |
| * @author Sven Mawson |
| * @since 2009.09.15 <b>tentative</b> |
| */ |
| public class ListenableFutureTask<V> extends FutureTask<V> |
| implements ListenableFuture<V> { |
| |
| // The execution list to hold our listeners. |
| private final ExecutionList executionList = new ExecutionList(); |
| |
| /** |
| * Creates a {@code ListenableFutureTask} that will upon running, execute the |
| * given {@code Callable}. |
| * |
| * @param callable the callable task |
| * @throws NullPointerException if callable is null |
| */ |
| public ListenableFutureTask(Callable<V> callable) { |
| super(callable); |
| } |
| |
| /** |
| * Creates a {@code ListenableFutureTask} that will upon running, execute the |
| * given {@code Runnable}, and arrange that {@code get} will return the |
| * given result on successful completion. |
| * |
| * @param runnable the runnable task |
| * @param result the result to return on successful completion. If |
| * you don't need a particular result, consider using |
| * constructions of the form: |
| * {@code ListenableFuture<?> f = |
| * new ListenableFutureTask<Object>(runnable, null)} |
| * @throws NullPointerException if runnable is null |
| */ |
| public ListenableFutureTask(Runnable runnable, V result) { |
| super(runnable, result); |
| } |
| |
| public void addListener(Runnable listener, Executor exec) { |
| executionList.add(listener, exec); |
| } |
| |
| @Override |
| protected void done() { |
| executionList.run(); |
| } |
| } |