001package com.hammurapi.common.concurrent; 002 003import java.util.concurrent.Callable; 004import java.util.concurrent.ExecutionException; 005import 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 */ 014public 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}