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
Future中的新增方法而在Netty的ChannelFuture接口的文档中,也对这一情况做了举例
ChannelFuture接口中的详细解释

发布了2 篇原创文章 · 获赞 6 · 访问量 205

猜你喜欢

转载自blog.csdn.net/weixin_43107388/article/details/103904967
今日推荐