在异步处理时,经常用到Future和Promise
netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。
- jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果
- netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束
- netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器
功能/名称 | jdk Future | netty Future | Promise |
cancel | 取消任务 | - | - |
isCanceled | 任务是否取消 | - | - |
isDone | 任务是否完成,不能区分成功失败 | - | - |
get | 获取任务结果,阻塞等待 | - | - |
getNow | - | 获取任务结果,非阻塞,还未产生结果时返回 null | - |
await | - | 等待任务结束,如果任务失败,不会抛异常,而是通过 isSuccess 判断 | - |
sync | - | 等待任务结束,如果任务失败,抛出异常 | - |
isSuccess | - | 判断任务是否成功 | - |
cause | - | 获取失败信息,非阻塞,如果没有失败,返回null | - |
addLinstener | - | 添加回调,异步接收结果 | - |
setSuccess | - | - | 设置成功结果 |
setFailure | - | - | 设置失败结果 |
一、Future
public interface Future<V> extends java.util.concurrent.Future<V>
1、同步方式
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop eventLoop = eventLoopGroup.next();
Future<Integer> future = eventLoop.submit(() -> {
Thread.sleep(1000);
return 50;
});
//主线程阻塞
Integer integer = future.get();
System.out.println(integer);
2、异步方式
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop eventLoop = eventLoopGroup.next();
Future<Integer> future = eventLoop.submit(() -> {
Thread.sleep(1000);
return 50;
});
future.addListener(new GenericFutureListener<Future<? super Integer>>() {
@Override
public void operationComplete(Future<? super Integer> future) throws Exception {
//当前执行线程为eventLoop线程
if(future.isSuccess()){
System.out.println(future.getNow());
}
}
});
二、Promise
1、同步方式
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop eventLoop = eventLoopGroup.next();
DefaultPromise<Integer> promise=new DefaultPromise<>(eventLoop);
eventLoop.submit(() -> {
try{
Thread.sleep(1000);
promise.setSuccess(50);
}catch (Exception e){
e.printStackTrace();
}
});
//主线程阻塞
System.out.println(promise.get());
2、异步方式
EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
EventLoop eventLoop = eventLoopGroup.next();
DefaultPromise<Integer> promise=new DefaultPromise<>(eventLoop);
eventLoop.submit(() -> {
try{
Thread.sleep(1000);
promise.setSuccess(50);
}catch (Exception e){
e.printStackTrace();
}
});
promise.addListener(new GenericFutureListener<Future<? super Integer>>() {
@Override
public void operationComplete(Future<? super Integer> future) throws Exception {
//当前执行线程为eventLoop线程
if(future.isSuccess()){
System.out.println(future.getNow());
}
}
});