11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.util.concurrent; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ForwardingObject; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Callable; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutionException; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ExecutorService; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Future; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.TimeUnit; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.TimeoutException; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An executor service which forwards all its method calls to another executor 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * service. Subclasses should override one or more methods to modify the 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * behavior of the backing executor service as desired per the <a 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://en.wikipedia.org/wiki/Decorator_pattern">decorator pattern</a>. 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kurt Alfred Kluever 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 390888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ForwardingExecutorService extends ForwardingObject 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements ExecutorService { 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** Constructor for use by subclasses. */ 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected ForwardingExecutorService() {} 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract ExecutorService delegate(); 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin public boolean awaitTermination(long timeout, TimeUnit unit) 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin throws InterruptedException { 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().awaitTermination(timeout, unit); 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin public <T> List<Future<T>> invokeAll( 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<? extends Callable<T>> tasks) throws InterruptedException { 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().invokeAll(tasks); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin public <T> List<Future<T>> invokeAll( 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin throws InterruptedException { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().invokeAll(tasks, timeout, unit); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin public <T> T invokeAny(Collection<? extends Callable<T>> tasks) 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin throws InterruptedException, ExecutionException { 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().invokeAny(tasks); 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin public <T> T invokeAny( 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws InterruptedException, ExecutionException, TimeoutException { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().invokeAny(tasks, timeout, unit); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean isShutdown() { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().isShutdown(); 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean isTerminated() { 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().isTerminated(); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void shutdown() { 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate().shutdown(); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public List<Runnable> shutdownNow() { 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().shutdownNow(); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void execute(Runnable command) { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate().execute(command); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public <T> Future<T> submit(Callable<T> task) { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().submit(task); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Future<?> submit(Runnable task) { 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().submit(task); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public <T> Future<T> submit(Runnable task, T result) { 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate().submit(task, result); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 118