知识卡片

主动调用会阻塞

普通读书笔记卡 · 1539

内容

join() 和 Future.get() 都是主动获取结果:调用方要主动去问被调用方”你完成了吗”,而非被调用方主动通知。它们能表达依赖关系,但本质是单向阻塞式调用,要等到被调用方执行完才返回;被调用方耗时不可控时,调用方线程会被长期占住,拖低吞吐和响应性。解法是反转调用方向,见 [[回调反转方向]]。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第9章《高并发核心模式之异步回调模式》9.4节《异步回调与主动调用》(源文件:_epub-src/OEBPS/Text/chapter285.xhtml) - 结论依据:原文指出“不论主线程调用join()进行闷葫芦式线程同步,还是使用Future.get()获取异步线程的执行结果,都属于主动模式的调用”“调用线程和被调用线程之间是一种主动关系,而不是被动关系”,并说明“主动调用是一种阻塞式调用,它是一种单向调用,‘调用方’要等待‘被调用方’执行完毕才返回。如果‘被调用方’的执行时间很长,那么‘调用方’线程需要阻塞很长一段时间”,因此推出本卡结论。 - 原始内容:不论主线程调用join()进行闷葫芦式线程同步,还是使用Future.get()获取异步线程的执行结果,都属于主动模式的调用……主动调用是一种阻塞式调用,它是一种单向调用,“调用方”要等待“被调用方”执行完毕才返回。如果“被调用方”的执行时间很长,那么“调用方”线程需要阻塞很长一段时间。