Netty中的Future和JDK中的Future的区别
近期在学习Netty的时候,看到了Netty中有一个和JDK中同名的Future接口,并继承了该接口,便做一个记录学习
JDK1.5中Future的缺陷
* class App {
* ExecutorService executor = ...
* ArchiveSearcher searcher = ...
* void showSearch(final String target)
* throws InterruptedException {
* Future<String> future
* = executor.submit(new Callable<String>() {
* public String call() {
* return searcher.search(target);
* }});
* displayOtherThings(); // do other things while searching
* try {
* displayText(future.get()); // use future
* } catch (ExecutionException ex) { cleanup(); return; }
* }
* }
Future源码中提供的示例
JDK中的Future的缺陷,因为程序是异步的,使用者并不知道何时调用future.get()这个方法。
Netty中的Future
对JDK中的java.util.concurrent.Future
的一种拓展
Netty中Future的解决办法
/** * Adds the specified listener to this future.
The * specified listener is notified when this
future is * {@linkplain #isDone() done}. If this future
is already * completed, the specified listener is notified
immediately. */
Future<V> addListener(GenericFutureListener<?
extends Future<? super V>> listener);
Netty通过listener的方式解决了这一问题。
当isDone()方法完成即future里的任务真正完成之后GenericFutureListener
中的operationComplete()
方法会被调用。即Future调用了operationComplete()
方法。这里使用了观察者模式。
所以把GenericFutureListener
的实现类写好,把operationComplete()
的方法写完,当Future动作完成之后,operationComplete()
方法就会自动得到调用。这样就不需要使用Future的get()方法去获取结果了。因为可以通过operationComplete()
中的参数拿到对应的结果。
Netty中Future的其他拓展
此外JDK1.5中的Future有一个isDone()
方法。该方法有些含糊不清,不管计算时正常中止、异常、取消完成都会返回true,所以该方法无法反映是正常完成还是抛出了异常
而Netty的Future的新增了isSuccess()
方法,该方法只有当I/O操作成功完成时返回true
而在Netty的ChannelFuture接口的文档中,也对这一情况做了举例