【发布时间】:2015-04-02 18:17:06
【问题描述】:
我的问题是 - 我使用 Scala 和 Akka - 其中一项工作是通过第三方 SDK 使用外部 API。问题是我无法控制这个 SDK,而且,我应该预料到里面会发生任何事情,甚至是无限循环。
我这样“解决”了这个问题
Await.result( Future { sdk.makeSomeCall()}, 1.minute)
所以我的代码不会永远阻塞。然而,我开始通过简单的Thread.sleep() 对makeSomeCall() 进行存根测试,发现Await.result 实际上并没有杀死未来,因为测试执行持续了大约1.minute 并随着这个参数而改变。
我调试了一下发现,实际上,Await.result 返回了,但是线程在后台继续,等待Thread.sleep 完成。
我假设我的代码只是从当前的 Future 中“分离”并让它在给定的线程中执行 - 这可能很快导致生产代码中的一些饥饿。
问题很简单 - 如何使其正确 - 这意味着在超时后新线程/Future 将被终止,并且此代码分配的所有资源都将被释放(我假设 SDK 可能会造成一些混乱,但这现在不是问题)
【问题讨论】:
-
我不知道你的问题是否正确,但你可以简单地
Await结果在你的其余代码之后,不是吗?跨度>
标签: multithreading scala akka