冬天实在太冷了,习惯了广东的天气,突然换个地方还真有点不适应, 早就想写的学习笔记也一直拖到现在。下面进入正题,一起来学习下netty的线程池实现。 我们知道java本身实现了一套线程池,即我们常见的ExecutorService。那么netty为什么还要定义自己的线程模型,什么时候适合用netty线程池,什么时候适合用ExecutorService。相信你看了这几篇文章就会有眉目。
先来张大图,直观的看下netty线程模型和java自带线程池的区别:
需要注意,此图对线程模型进行了简化。图左netty中的executor指jdk中的Executor接口。
了解Promise前我们先看看Future。Future代表一个异步任务的结果,由于是异步任务,得到Future并不代表任务结束,你可以通过get来等待真正结果的返回,或者通过cancal来取消任务。netty对java.util.concurrent.Future进行了增强:
方法名 | 说明 |
---|---|
isSuccess | 任务是否执行成功 |
isCancellable | 任务是否可以取消 |
cause | 任务产生的异常 |
addListener | 添加listener, 任务完成后执行listener,如果任务已经完成,则添加时立刻执行 |
removeListener | 移除listener |
sync | 等待任务结束,如果任务产生异常或被中断则抛出异常,否则返回Future自身 |
syncUninterruptibly | 等待任务结束,任务本身不可中断,如果产生异常则抛出异常,否则返回Future自身 |
await | 等待任务结束,如果任务被中断则抛出中断异常,与sync不同的是只抛出中断异常,不抛出任务产生的异常 |
awaitUninterruptibly | 等待任务结束,任务不可中断 |