001 package com.hammurapi.util.concurrent;
002
003 import java.util.concurrent.Callable;
004 import java.util.concurrent.ExecutionException;
005 import java.util.concurrent.FutureTask;
006
007 /**
008 * Future task which cannot block in get() indefinitely. If it is not yet started,
009 * the task gets executed in the caller thread.
010 * @author Pavel Vlasov
011 *
012 * @param <V>
013 */
014 public class NonBlockingFutureTask<V> extends FutureTask<V> {
015
016 public NonBlockingFutureTask(Callable<V> callable) {
017 super(callable);
018 }
019
020 public NonBlockingFutureTask(Runnable runnable, V result) {
021 super(runnable, result);
022 }
023
024 @Override
025 public V get() throws InterruptedException, ExecutionException {
026 if (!isDone()) {
027 run();
028 }
029 return super.get();
030 }
031
032 }