Java 非阻塞式通信中需要了解的概念:Future
Netty 中 ChannelFuture 和 Promise 都是继承 java.util.concurrent.Future,所以有必要好好总结一下。
1.Future 的介绍、用途
简而言之,Future表示异步计算的将来结果–在处理完成后最终会出现在Future中。
耗时间运行的方法非常适合异步处理和Future接口。这使我们能够在等待Future中封装的任务完成之前执行其他一些操作。
可以利用Future的异步特性的一些操作:
密集型计算过程(数学和科学计算)
处理大数据结构(或大数据)
远程方法调用(下载文件,HTML抓取,Web服务)
2.FutureTask
下面的示例,我们将创建一个非常简单的类来计算Integer的平方。这绝对不适合“耗时操作”的方法类别,但是我们将对其进行Thread.sleep()调用,使其持续1秒才能完成:
public class SquareCalculator {
private ExecutorService executor
= Executors.newSingleThreadExecutor();
public Future<Integer> calculate(Integer input) {
return executor.submit(() -> {
Thread.sleep(1000);
return input * input;
});
}
}
实际执行计算的部分代码包含在call()方法中,以lambda表达式形式提供。代码很简单,除了前面提到的sleep()调用外,没有什么特别的。
Callable是表示任务的接口,该接口返回结果并具有单一call()方法。在这里,我们使用lambda表达式创建了它的实例。
创建Callable实例后,我们必须将此实例传递给执行者,该执行者将负责在新线程中启动该任务并把宝贵的Future对象返回给我们。那就是ExecutorService的任务。