对netty线程模型了解不深,使用Future的sync()或await()方法不当会产生BlockingOperationException。stackoverflow上有个回答很好的解答了这个问题:stackoverflow
1 | BlockingOperationException will be throw by netty if you call sync*or await* on a Future in the same thread that the EventExecutor is using and to which the Future is tied to. This is usually the EventLoop that is used by the Channel itself. |
源码解析
Future代表一个异步任务的结果,netty对java.util.concurrent.Future进行了增强:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57/**
* 扩展了JDK的Future接口
*/
public interface Future<V> extends java.util.concurrent.Future<V> {
//异步操作完成且正常终止
boolean isSuccess();
//异步操作是否可以取消
boolean isCancellable();
//异步操作失败的原因
Throwable cause();
//添加一个监听者,异步操作完成时回调,类比javascript的回调函数
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
//添加多个监听者
Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
//移除一个监听者
Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
//移除一个监听者
Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
//等待任务结束,如果任务产生异常或被中断则抛出异常,否则返回Future自身
Future<V> sync() throws InterruptedException;
//等待任务结束,任务本身不可中断,如果产生异常则抛出异常,否则返回Future自身
Future<V> syncUninterruptibly();
//等待任务结束,如果任务被中断则抛出中断异常,与sync不同的是只抛出中断异常,不抛出任务产生的异常
Future<V> await() throws InterruptedException;
//阻塞直到异步操作完成
Future<V> awaitUninterruptibly();
//同await,加了时间限制
boolean await(long timeout, TimeUnit unit) throws InterruptedException;
//同await,加了时间限制
boolean await(long timeoutMillis) throws InterruptedException;
//同awaitUninterruptibly,加了时间限制
boolean awaitUninterruptibly(long timeout, TimeUnit unit);
//同awaitUninterruptibly,加了时间限制
boolean awaitUninterruptibly(long timeoutMillis);
//非阻塞地返回异步结果,如果尚未完成返回null
V getNow();
//取消任务
@Override
boolean cancel(boolean mayInterruptIfRunning);
}
1 | DefaultPromise.java |