public class FutureTask
extends Object
implements RunnableFuture可取消的异步计算。 该类提供了一个Future的基本实现 ,具有启动和取消计算的方法,查询计算是否完整,并检索计算结果。 结果只能在计算完成后才能检索; 如果计算尚未完成,则get方法将阻止。 一旦计算完成,则无法重新启动或取消计算(除非使用runAndReset()调用计算 )。
A FutureTask可用于包装Callable或Runnable对象。 因为FutureTask实现Runnable ,一个FutureTask可以提交到一个Executor执行。
除了作为独立类之外,此类还提供了protected功能,在创建自定义任务类时可能很有用。
public interface FutureA Future计算的结果。 提供方法来检查计算是否完成,等待其完成,并检索计算结果。 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪。 取消由cancel方法执行。 提供其他方法来确定任务是否正常完成或被取消。 计算完成后,不能取消计算。 如果您想使用Future ,以便不可撤销,但不提供可用的结果,则可以声明Future<?>表格的类型,并返回null作为基础任务的结果。
示例使用 (请注意,以下课程都是化妆品。)
interface ArchiveSearcher { String search(String target); } class App { ExecutorService executor = … ArchiveSearcher searcher = … void showSearch(final String target) throws InterruptedException { Future future = executor.submit(new Callable() { public String call() { return searcher.search(target); }}); displayOtherThings(); // do other things while searching try { displayText(future.get()); // use future } catch (ExecutionException ex) { cleanup(); return; } } } FutureTask类是实现Future ,实现Runnable ,所以可以由Executor执行。 例如,以上建设与submit可以替换为:
FutureTask future = new FutureTask(new Callable() { public String call() { return searcher.search(target); }});
executor.execute(future);
内存一致性影响:异步运算采取的操作happen-before操作在另一个线程中相应的Future.get() Future.get() 。