FutureTask例子(转)
转自: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(); }}