简介:
FutureTask实现的接口有Future接口、Runnable接口。
因此,FutureTask可以交给Executor执行,也可以由调用线程直接执行,FutureTask.run()。
FutureTask的三种状态:
①未启动。还未执行FutureTask.run();
②已启动。run方法执行过程中;
③已完成。run方法执行结束或取消、或异常。
根据上面的三种状态:
1、对于FutureTask.get()方法:
当FutureTask处于未启动/已启动状态,执行FutureTask.get()将导致调用线程阻塞。
当已完成,将导致立即返回结果/抛出异常。
2、对于FutureTask.cancel(true/false)方法:
未启动状态时调用:不被执行;
已启动状态时调用:(1)true:以中断方式试图停止任务(2)false:让正在执行的任务运行完成,剩下的哼哼。
已完成状态时调用:return false;
代码实现:
FutureTask基于AQS实现,属于可阻塞类中的一员。
(AQS是一个同步框架,提供通用机制来原子性管理同步状态、阻塞、唤醒线程,以及维护被阻塞线程的队列)
每一个基于AQS实现的同步器至少包含以下两种操作:
①至少一个acquire操作:用来阻塞调用线程。在FutureTask中对应get方法。
②至少一个release方法:用来解除阻塞。在FutureTask中对应run()方法和cancel(...)方法。
基于“复合优先于继承的原则”,FutureTask声明了一个内部私有的继承于AQS的子类Sync,对FutureTask的所有的公有方法都会调用这个内部子类。