转自:http://programmingexamples.wikidot.com/futuretask
A cancellable asynchronous computation. This class provides a base implementation of Future, with methods to start and cancel a computation, query to see if the computation is complete, and retrieve the result of the computation. The result can only be retrieved when the computation has completed; the get method will block if the computation has not yet completed. Once the computation has completed, the computation cannot be restarted or cancelled.[1]
The following example illustrates the use of the Futuretask together with the Callable.
It reverses the submitted string slowly at a rate of one char per second. In the mean time, the main thread keeps polling to see if the task is completed.
import java.util.concurrent.*;
import java.util.concurrent.ExecutorService;
public class MyStringReverser
{
ExecutorService executor = Executors.newFixedThreadPool(1);
SlowStringReverser reverser = new SlowStringReverser();
void doReverse(final String target) throws InterruptedException
{
FutureTask<String> future = new FutureTask<String>(
new Callable<String>()
{
public String call()
{
return reverser.reverseString(target);
}
});
executor.execute(future);
// try every 10 seconds
while (!future.isDone())
{
System.out.println("Task not yet completed.");
try
{
Thread.sleep(500);
} catch (InterruptedException ie)
{
System.out.println("Will check after 1/2 sec.");
}
}
try
{
System.out.println("Here is the result..." + future.get());
} catch (ExecutionException ex)
{
}
executor.shutdown();
return;
}
public static void main(String args[])
{
MyStringReverser msr = new MyStringReverser();
try
{
msr.doReverse("foobar");
} catch (Exception e)
{
e.printStackTrace();
}
}
}
class SlowStringReverser
{
StringBuffer orgString;
StringBuffer reversedString;
SlowStringReverser(String orgStr)
{
orgString = new StringBuffer(orgStr);
}
SlowStringReverser()
{
}
public String reverseString(String str)
{
orgString = new StringBuffer(str);
reversedString = new StringBuffer();
for (int i = (orgString.length() - 1); i >= 0; i--)
{
reversedString.append(orgString.charAt(i));
System.out.println("Reversing one character per second."
+ reversedString);
try
{
Thread.sleep(1000);
} catch (InterruptedException ie)
{
}
}
return reversedString.toString();
}
}