天下皆知美之为美,斯恶已;此专栏本想取名代码之美,但有傍名之嫌,也给别误解,所以就叫代码小析吧,看到一段好代码,思路清奇,奇巧淫技,拿出来鉴赏一番
之前是计划one week one alogrithm,结果算法是个短板,不仅要理解,还得再写出代码,特别烧脑,所以中间穿插一下,换换脑子
之前有类似一篇《仅且仅创建一次对象》
最近看到一个段子:
老板有毛病吧,写完排序就叫我走人,我还嫌你这9K工资低了呢
感觉能想到这思路的也算清奇,哈哈!
回调
if you call me, i will call back
回调分类:同步回调,异步回调
场景
建立TCP连接是很耗时的,所以在创建Socket Channel时,可以通过异步回调方式解决
代码
1 | /** |
完整的代码:https://github.com/zhuxingsheng/javastudy
亮点
思路很简单,亮点就在于job队列,连接在没有建立成功时,会先建立一个EmptyChannel,有些类似lazy load中的影子对象放到队列中,不造成阻塞,当channel建立完成后,回调
VS Future模式
异步回调的套路与Future模式特别类似
1 | Future future = doTask1(); |
Future 模式中,一个任务的启动和获取结果分成了两部分,启动执行是异步的,调用后立马返回,调用者可以继续做其他的任务,而等到其他任务做完,再获取Future的结果,此时调用 get 时是同步的,也就是说如果 doTask1 如果还没有做完,等它做完。
看出最大区别,异步回调不需要返回值,准确说调用者不用太关心返回值,甚至不需要关心真正执行情况,而future模式就不一样了,调用者是一定要拿到返回值的