1bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors 3bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 4bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Licensed under the Apache License, Version 2.0 (the "License"); 5bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * you may not use this file except in compliance with the License. 6bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * You may obtain a copy of the License at 7bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 8bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * http://www.apache.org/licenses/LICENSE-2.0 9bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 10bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Unless required by applicable law or agreed to in writing, software 11bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * distributed under the License is distributed on an "AS IS" BASIS, 12bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * See the License for the specific language governing permissions and 14bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * limitations under the License. 15bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 16bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 17bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorpackage com.google.common.util.concurrent; 18bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 19bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.Callable; 20bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.Executor; 21bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnorimport java.util.concurrent.FutureTask; 22bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 25bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor/** 26bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * A {@link FutureTask} that also implements the {@link ListenableFuture} 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * interface. Unlike {@code FutureTask}, {@code ListenableFutureTask} does not 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * provide an overrideable {@link FutureTask#done() done()} method. For similar 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * functionality, call {@link #addListener}. 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 31bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * @author Sven Mawson 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 1.0 33bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class ListenableFutureTask<V> extends FutureTask<V> 35bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor implements ListenableFuture<V> { 36bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 37bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor // The execution list to hold our listeners. 38bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor private final ExecutionList executionList = new ExecutionList(); 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 40bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 41bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Creates a {@code ListenableFutureTask} that will upon running, execute the 42bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * given {@code Callable}. 43bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param callable the callable task 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 46bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <V> ListenableFutureTask<V> create(Callable<V> callable) { 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ListenableFutureTask<V>(callable); 49bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 50bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 51bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor /** 52bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * Creates a {@code ListenableFutureTask} that will upon running, execute the 53bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * given {@code Runnable}, and arrange that {@code get} will return the 54bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * given result on successful completion. 55bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor * 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param runnable the runnable task 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param result the result to return on successful completion. If you don't 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * need a particular result, consider using constructions of the form: 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code ListenableFuture<?> f = ListenableFutureTask.create(runnable, 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * null)} 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 62bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor */ 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <V> ListenableFutureTask<V> create( 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Runnable runnable, @Nullable V result) { 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ListenableFutureTask<V>(runnable, result); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private ListenableFutureTask(Callable<V> callable) { 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(callable); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private ListenableFutureTask(Runnable runnable, @Nullable V result) { 73bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor super(runnable, result); 74bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 75bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 77bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor public void addListener(Runnable listener, Executor exec) { 78bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor executionList.add(listener, exec); 79bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Internal implementation detail used to invoke the listeners. 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 84bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor @Override 85bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor protected void done() { 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert executionList.execute(); 87bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor } 88bfe2dd089341dcb4c1fb65a5b6b077ad0ebbf6dcDan Egnor} 89